题意:很容易理解...
思路:可以说是数塔(hdu 2084)的类似题,做这个题得时候我们可以先画个图,在第0秒的时候在5位置,第一秒的时候可以在4,5,6位置然后依次类推,然后很容易观察出问题的解法了,其实从上往下推和从下往上推都可以,只不过从下往上推要好做一点,这里我给出了两种方法的解题代码。
代码实现:
#include<stdio.h>//从下往上推的 #include<string.h> int a[100005][15],dp[100005][15]; int nima(int i,int j) { int x1,x2,x3,temp; x1=j-1;x2=j;x3=j+1; if(x1<0) x1=0; if(x3>10) x3=10; temp=dp[i+1][x1]>dp[i+1][x2]?dp[i+1][x1]:dp[i+1][x2]; return temp>dp[i+1][x3]?temp:dp[i+1][x3]; } int main() { int n,i,j,max,t1,t2,f,r; while(scanf("%d",&n)!=EOF&&n) { max=-1; memset(a,0,sizeof(a)); memset(dp,0,sizeof(dp)); for(i=1;i<=n;i++) { scanf("%d%d",&t1,&t2); dp[t2][t1]++; if(t2>max) max=t2; } for(i=max-1;i>=0;i--) { if(i>=5) { for(j=0;j<=10;j++) dp[i][j]+=nima(i,j); } else { f=5-i;r=5+i; for(j=f;j<=r;j++) dp[i][j]+=nima(i,j); } } printf("%d\n",dp[0][5]); } return 0; }
#include<stdio.h>//从上往下推的 #include<string.h> int dp[100005][15],a[100005][15]; int nima(int i,int j,int f,int r) { int x1,x2,x3,temp; x1=j-1;x2=j;x3=j+1; if(x1>=f&&x1<=r) temp=dp[i-1][x1]>dp[i-1][x2]?dp[i-1][x1]:dp[i-1][x2]; else temp=dp[i-1][x2]; if(x3>=f&&x3<=r) temp=dp[i-1][x3]>temp?dp[i-1][x3]:temp; return temp; } int main() { int n,i,j,max,t1,t2,f1,r1,f2,r2,kao; while(scanf("%d",&n)!=EOF&&n) { max=-1;kao=-1; memset(a,0,sizeof(a)); memset(dp,0,sizeof(dp)); for(i=1;i<=n;i++) { scanf("%d%d",&t1,&t2); a[t2][t1]++; if(t2>max) max=t2; } dp[0][5]=a[0][5];f1=5;r1=5; for(i=1;i<=max;i++) { if(i<=5) { f2=5-i;r2=5+i; for(j=f2;j<=r2;j++) { dp[i][j]=a[i][j]+nima(i,j,f1,r1); if(dp[i][j]>kao) kao=dp[i][j]; } f1=f2; r1=r2; } else { f1=0;r1=10; for(j=0;j<=10;j++) { dp[i][j]=a[i][j]+nima(i,j,f1,r1); if(dp[i][j]>kao) kao=dp[i][j]; } } } printf("%d\n",kao); } return 0; }