hdu1176免费馅饼
代码有点长,不过ACCEPT了
创新点是输入时,用set数组来表示第t秒x个位置上下了一个饼
看了人家给得特殊例子,发现一个问题,当第i秒没有饼下来,或者第i秒饼下的位置人没有走到,这两种特殊情况,所以就加了以下的几行代码
if(set[i][j-1]!=0&&j-1>=0)dp[i][j-1]=max(dp[i][j-1],dp[i-1][j]+set[i][j-1]);
if(set[i][j]!=0)dp[i][j]=max(dp[i][j],dp[i-1][j]+set[i][j]);
if(set[i][j+1]!=0&&j+1<=10)dp[i][j+1]=max(dp[i][j+1],dp[i-1][j]+set[i][j+1]);
if(set[i][j-1]==0&&j-1>=0)dp[i][j-1]=max(dp[i][j-1],dp[i-1][j]+set[i][j-1]);
if(set[i][j]==0)dp[i][j]=max(dp[i][j],dp[i-1][j]+set[i][j]);
if(set[i][j+1]==0&&j+1<=10)dp[i][j+1]=max(dp[i][j+1],dp[i-1][j]+set[i][j+1]);
#include "iostream" #include "string.h" using namespace std; int max(int a,int b){return a>b?a:b;} int set[100010][12],dp[100010][16]; int main(){ int n,time,maxb,i,x,t,j; while(cin>>n){ if(!n)break; time=0;maxb=0; memset(set,0,sizeof(set)); for(i=1;i<=n;i++){cin>>x>>t;set[t][x]++;time=max(time,t);} for(i=0;i<=time;i++){ for(j=0;j<=10;j++) dp[i][j]=0; } dp[0][5]=1; for(i=1;i<=time;i++){ for(j=0;j<=10;j++){ if(dp[i-1][j]){ if(set[i][j-1]!=0&&j-1>=0)dp[i][j-1]=max(dp[i][j-1],dp[i-1][j]+set[i][j-1]); if(set[i][j]!=0)dp[i][j]=max(dp[i][j],dp[i-1][j]+set[i][j]); if(set[i][j+1]!=0&&j+1<=10)dp[i][j+1]=max(dp[i][j+1],dp[i-1][j]+set[i][j+1]); if(set[i][j-1]==0&&j-1>=0)dp[i][j-1]=max(dp[i][j-1],dp[i-1][j]+set[i][j-1]); if(set[i][j]==0)dp[i][j]=max(dp[i][j],dp[i-1][j]+set[i][j]); if(set[i][j+1]==0&&j+1<=10)dp[i][j+1]=max(dp[i][j+1],dp[i-1][j]+set[i][j+1]); } } //for(j=0;j<=10;j++)cout<<dp[i][j]<<' ';cout<<endl; } for(i=0;i<=10;i++){maxb=max(maxb,dp[time][i]);} if(maxb==0)cout<<0<<endl; else cout<<maxb-1<<endl; } }
看看人家网上的答案,才知道,自己的重要部分的代码真的挺长的,大神说这是数塔的变型,而且他跟我的一个不同点是,我从0 5走到最后,他是从最后往回走,走到0 5
看看大神的代码吧
#include <iostream> #include <string.h> #include <stdio.h> using namespace std; int max3(int a,int b,int c) { a = a>b?a:b; a = a>c?a:c; return a; } int max2(int a,int b) { a = a>b?a:b; return a; } int t[100001][11]; int main() { int n,T,x,max; while(scanf("%d",&n)&&n) { memset(t,0,sizeof(t)); max = 0; while(n--) { scanf("%d %d",&x,&T); t[T][x]++; max = max>T?max:T; } for(int i = max-1; i >= 0; i--) { for(int j = 0; j <= 10; j++) { if(j==0)t[i][j] += max2(t[i+1][j],t[i+1][j+1]); else if(j==10) t[i][j] += max2(t[i+1][j],t[i+1][j-1]); else t[i][j] += max3(t[i+1][j-1],t[i+1][j],t[i+1][j+1]); } } cout<<t[0][5]<<endl; } return 0; }