hdu 1176 免费馅饼(nyist 613)
http://acm.hdu.edu.cn/showproblem.php?pid=1176
dp[i][j]:表示第i秒接j位置的馅饼的最大值。
三种状态:
dp[i][j]=max(dp[i-1][j],dp[i-1][j-1],dp[i-1][j+1])+a[i][j]
分别是上一秒接j位置,上一秒接j-1位置,上一秒接j+1位置。
注意数组初始化。
#include <iostream> #include <cstring> using namespace std; int dp[100005][11],a[100005][11]; int main(int argc, char *argv[]) { int n,i,j,id,t,maxt,ans; while(cin>>n&&n) { memset(a,0,sizeof(a)); for(maxt=0,i=1;i<=n;i++) { cin>>id>>t; a[t][id]++; if(maxt<t) maxt=t; } for(i=1;i<=maxt;i++) for(j=0;j<=10;j++) dp[i][j]=-1000000005; dp[1][4]=a[1][4]; dp[1][5]=a[1][5]; dp[1][6]=a[1][6]; int x1,x2,x3; for(i=2;i<=maxt;i++) for(j=0;j<=10;j++) { x1=dp[i-1][j]+a[i][j]; if(j-1>=0) x2=dp[i-1][j-1]+a[i][j]; else x2=-1000000005; if(j+1<=10) x3=dp[i-1][j+1]+a[i][j]; else x3=-1000000005; if(x1<x2) x1=x2; if(x1<x3) x1=x3; dp[i][j]=x1; //cout<<i<<" -> "<<j<<" "<<dp[i][j]<<endl; } for(ans=i=0;i<=10;i++) { if(dp[maxt][i]>ans) ans=dp[maxt][i]; } cout<<ans<<endl; } return 0; }