hdu-1176(dp)
阿新 • • 發佈:2018-03-14
== 同時 scanf ret pri 移動 blog OS div
解題思路:用dp做的,dp[i][j]表示在i時刻,j點的最大餡餅。a[i][j]表示在i這個時刻j點同時掉落的餡餅;
每個點除了0和10之外,都有三種狀態;
1、沒有移動,這樣值就為dp[i][j]=max(dp[i][j],dp[i-1][j]+a[i][j]);
2、從左邊移動來的,dp[i][j]=max(dp[i][j],dp[i-1][j-1]+a[i][j]);
3、從右邊移動來的,dp[i][j]=max(dp[i][j],dp[i-1][j+1]+a[i][j]);
初始化dp[i][j]=-1;dp[0][5]=0;本身在5這個點;
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #define maxn 100005 using namespace std; int dp[maxn][12]; int a[maxn][12]; int n; int main() { int x,t; while(scanf("%d",&n)!=EOF) { if(n==0) return 0; memset(dp,-1,sizeof(dp)); memset(a,0,sizeof(a)); while(n--) { scanf("%d%d",&x,&t); a[t][x]++; } int ans=-888; dp[0][5]=0; for(int i=1;i<=100000;i++)//時間; { for(int j=0;j<=10;j++)//地點; { if(dp[i-1][j]!=-1) dp[i][j]=max(dp[i][j],dp[i-1][j]+a[i][j]); if(j!=0&&dp[i-1][j-1]!=-1) dp[i][j]=max(dp[i][j],dp[i-1][j-1]+a[i][j]); if(j!=10&&dp[i-1][j+1]!=-1) dp[i][j]=max(dp[i][j],dp[i-1][j+1]+a[i][j]); ans=max(ans,dp[i][j]); } } printf("%d\n",ans); } return 0; }
hdu-1176(dp)