您的位置:首页 > 其它

hdu 1176免费馅饼

2012-03-26 18:57 253 查看
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
int max3(int a,int b,int c)
{
return max(a,max(b,c));
}
int dp[11][100010];
int main()
{
int i,j,n,e,t,m;
while(scanf("%d",&n)!=EOF&&n)
{
memset(dp,0,sizeof(dp));
m = 0;
for(i = 0;i<n;i ++)
{
scanf("%d%d",&e,&t);
dp[e][t] ++;
if(m < t) m = t;
}
for(i = m-1;i >= 0;i --)
{
for(j = 0;j < 11;j ++)
{
if(j == 0) dp[j][i] += max(dp[0][i+1],dp[1][i+1]);
else if(j == 10) dp[j][i] += max(dp[10][i +1],dp[9][i+1]);
else
{
dp[j][i] +=max3(dp[j-1][i+1],dp[j][i+1],dp[j+1][i+1]);
}
}
}
printf("%d\n",dp[5][0]);
}
}


数塔的变形;

数塔问题要注意的就是推理的顺序。一般起点和终点都已经决定了顺序,因为数塔的两种顺序都是一样的,而最终的答案的点就是起点或终点。像这题就应该逆序推理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: