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