想法:
首先我们不能从时间0开始考虑问题而是从最后时间往前考虑问题
这样想的话时间i地点j要得最多饼则看时间i+1(地点j 地点j-1 地点j+1)那个得到饼最多+之前所得饼
有因为地点1 地点10情况特殊要分开考虑
核心代码:
for(i=m-1;i>=0;i--) { for(j=1;j<=9;j++) {a[i][j]+=maxx(a[i+1][j-1],a[i+1][j],a[i+1][j+1]);} a[i][0]+=max(a[i+1][0],a[i+1][1]); a[i][10]+=max(a[i+1][10],a[i+1][9]); }
代码:
#include<stdio.h> #include<string.h> int a[100010][11]; int max(int x,int y) { return x>y?x:y; } int maxx(int x1,int y1,int z1) { int t1=x1>y1?x1:y1; t1=t1>z1?t1:z1; return t1; } int main() { int n; while(scanf("%d",&n),n) { int i,j,x,t; memset(a,0,sizeof(a)); int m=0; for(i=1;i<=n;i++) { scanf("%d %d",&x,&t); a[t][x]++; if(t>m) m=t; } for(i=m-1;i>=0;i--) { for(j=1;j<=9;j++) {a[i][j]+=maxx(a[i+1][j-1],a[i+1][j],a[i+1][j+1]);} a[i][0]+=max(a[i+1][0],a[i+1][1]); a[i][10]+=max(a[i+1][10],a[i+1][9]); } printf("%d\n",a[0][5]); } return 0; }
优秀代码:
# include<stdio.h> # include<iostream> # include<string.h> using namespace std; int a[110000][12]; inline int Input() { int res=0,f=1,c; while(!isdigit(c = getchar()) && c!='-') ; c=='-' ? f=0 : res=c-'0'; while(isdigit(c = getchar())) res = res*10 + c-'0'; return f ? res : -res; } int max1(int x,int y) { return x>y?x:y; } int max(int a,int b,int c) { if(a>b) b=a; if(c>b) b=c; return b; } int main() { int n,i,j,x,y,m; while(scanf("%d",&n)&&n) { memset(a,0,sizeof(a)); m=0; for(i=0;i<n;i++) { x=Input(); y=Input(); a[y][x]++; if(y>m) m=y; } for(i=m;i>0;i--) for(j=0;j<11;j++) { if(j==0) a[i-1][j]+=max1(a[i][j],a[i][j+1]); else if(j==10) a[i-1][j]+=max1(a[i][j],a[i][j-1]); else a[i-1][j]+=max(a[i][j-1],a[i][j],a[i][j+1]); } printf("%d\n",a[0][5]); } return 0; }