hdu 1176 免费馅饼

刚开始思路不清,输入不明,WA了几次。静下心来分析,得出状态转移方程就好了。果然做题时要认真啊~~~

解题思路:这题是一道典型的DP,类似于hdu2084数塔的变形,时间和位置分别作为矩阵的列和行,自顶向下考虑,自底向上计算,状态转移方程f[i][j]+= max(m[i+1][j-1],m[i+1][j],m[i+1][j+1]),为了能存放最优解的值,则列位置向右偏移一个单位,即m[0][6]为本题的最优解. 可以直接用f[][]来保存输入,这样减少一个数组的使用。


AC代码:

#include<stdio.h>
#include<string.h>
#define MAX_NUM 100005
int f[MAX_NUM][13];
inline int max(int x,int y, int z){
	int temp = (x>=y?x:y);
	return temp>=z?temp:z;
}

int main(){
	int n,max_t,cases,t,x,i,j;
	while(scanf("%d",&n)!=EOF&&n!=0){
		//a[1][5]=1;a[1][4]=1;a[1][6]=1;
		//memset(a,0,sizeof(a));
		memset(f,0,sizeof(f));
		cases=n;
		max_t=-1;
		while(cases--){
			scanf("%d%d",&x,&t);
			f[t][x+1]++;
			if(max_t<=t)
				max_t=t;
		}
		 
		for(i=max_t-1;i>=0;i--){
			for(j=1;j<=11;j++)
			{
				f[i][j]+=max(f[i+1][j-1],f[i+1][j],f[i+1][j+1]);

			}
		}
		printf("%d\n",f[0][6]);
		

	}
	return 0;
}


你可能感兴趣的:(hdu 1176 免费馅饼)