动态规划训练18 [免费馅饼 HDU

来源:互联网 发布:阿里云备案幕布剪裁 编辑:程序博客网 时间:2024/05/29 15:48

免费馅饼

 HDU - 1176 


这也是一道比较简单的动态规划

dp[i][j]表示到时间i,位置为j所能采集的最大馅饼数量

状态转移非常好写

dp[i][j] = max{dp[i-1][j],dp[i-1][j-1],dp[i-1][j+1]} + T[j][i]

其中T[j][i]表示的是时间为i,位置为j落下的馅饼的数量


#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int MAX = 100000;const int INF = 1e9;int dp[MAX][14]; int T[14][MAX];int main(){int n;while(~scanf("%d",&n) && n){for(int i = 0;i < MAX;i++){for(int j = 0;j <= 10;j++){dp[i][j] = -INF;}}memset(T,0,sizeof(T));int mx = 0;for(int i = 0;i < n;i++){int a,b;scanf("%d%d",&a,&b);T[a][b] ++;mx = max(mx,b);}dp[0][5] = 0;for(int i = 1;i <= mx;i++){for(int j = 0;j <= 10;j++){dp[i][j] = max(dp[i][j],dp[i-1][j-1] + T[j][i]);dp[i][j] = max(dp[i][j],dp[i-1][j] + T[j][i]);dp[i][j] = max(dp[i][j],dp[i-1][j+1] + T[j][i]);}}int ans = 0;for(int i = 0;i <= 10;i++){ans = max(ans,dp[mx][i]);}printf("%d\n",ans);}return 0;} 


原创粉丝点击