标签:
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1176
题意就自己去看看啦= = 我就不说了 毕竟中文题面。
解决思路:动态规划
dp[i][t]含义:在t时刻i点可以接到的馅饼数
转移方程要分三种情况来考虑,一个是在左右两个端点,左端点的时候dp[i][t]+=max(dp[i][t-1],dp[i+1][t-1]) 表示在t时刻i地点可以接到的最大的馅饼数等于在该点应该掉下来的数量加上前一个时刻在这个地点接到的馅饼数量的最大值或者在右边前一个时刻接到的最大的馅饼数量,这两个量取哪一个取决于哪一个大,谁大就从哪里转移过来。
右端点:dp[i][t]+=max(dp[i][t-1],dp[i-1][t-1])
中间:dp[i][t]+=max(dp[i-1][t-1],dp[i][t-1],dp[i+1][t-1])
分析方式和上面是一样的 大家自己理解一下啦。
代码:
/************************************************************************* > File Name: 1176.cpp > Author: kanberra > Mail: kanberra354562007@gmail.com > Created Time: 一 10/ 5 21:23:04 2015 ************************************************************************/ #include <bits/stdc++.h> using namespace std; int dp[11][100005]; int main(){ //freopen("test.in","r",stdin); int m; int ca=1; while (scanf("%d",&m)==1&&m){ cout<<"Case "<<ca++<<":"<<endl; memset(dp,0,sizeof(dp)); int x,T; int mxT=0,mnT=0; for (int i=0;i<m;i++){ scanf("%d%d",&x,&T); dp[x][T]++; mxT=max(mxT,T); mnT=min(mnT,T); } int mx=dp[5][mnT]; for (int t=mnT+1;t<=mxT;t++){ int pos=5-2*(t-mnT)+1; if (pos<0) pos=0; for (int i=pos;i<=10&&i<=5+2*(t-mnT)+1;i++){ if (i==0) dp[i][t]+=max(dp[i][t-1],dp[i+1][t-1]); else if (i==10) dp[i][t]+=max(dp[i][t-1],dp[i-1][t-1]); else dp[i][t]+=max(dp[i][t-1],max(dp[i-1][t-1],dp[i+1][t-1])); mx=max(mx,dp[i][t]); } } printf("%d\n",mx); } return 0; }
标签:
原文地址:http://www.cnblogs.com/kanberra/p/4857363.html