刚开始思路不清,输入不明,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;
}