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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值