HDU 1176
这是一道简单的动态规划入门题目。
这道题与经典动态规划题目数塔非常相似。
在写这道题的时候思路不太清晰:当时我按时间递增顺序遍历每一秒,忘记了加上的是上一秒合法情况的最大值(写的时候居然想成了加上data[i-1][j-1]、data[i-1][j]和data[i-1][j+1]),所以在空行的处理上纠结了很长的时间。最后才突然发现了自己犯下的这个低级错误。
另外,由于第一秒处在 x=5 的位置,所以在前4秒(也可以说是前5秒)的所有合法位置构成的是三角形,这一点需要注意。
我最后采用按时间递减的顺序遍历每一秒,所以没有理会那个三角形。
代码还需要优化。
#include<stdio.h>
#include<string.h>
#define max_time 100010
#define max_bdry 11
int data[max_time][max_bdry];
int max(int,int,int);
int main()
{
int n;
while(scanf("%d",&n),n)
{
int i,j,x,y,maxr=0;
memset(data,0,sizeof(data));
for(i=0;i<n;i++)
{
scanf("%d %d",&x,&y);
++data[y][x];
if(y>maxr)//如果所给数据没有按时间递增给出,需要找到最大时间
maxr=y;
}
for(i=maxr;i>0;i--)
{
for(j=0;j<max_bdry;j++)
{
if(j==0)//边界情况
data[i][j]+=max(0,data[i+1][j],data[i+1][j+1]);
else if(j==max_bdry-1)//边界情况
data[i][j]+=max(data[i+1][j-1],data[i+1][j],0);
else
data[i][j]+=max(data[i+1][j-1],data[i+1][j],data[i+1][j+1]);
}
}
printf("%d\n",max(data[1][5],data[1][4],data[1][6]));
}
return 0;
}
int max(int a,int b,int c)
{
if(a<=b)
a=b;
if(a>c)
return a;
else
return c;
}
浙公网安备 33010602011771号