题目链接:HDU 1176 免费馅饼
中文题。
dp[i][j]表示第i秒在j位置得到最大的馅饼数,右边1步,左边1步,原地不动三个状态转移过来。
状态转移方程:dp[i][j]=max(dp[i+1][j],max(dp[i+1][j+1],dp[i+1][j-1]))+mp[i][j];
AC代码:
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; const int maxn=100000+10; int dp[maxn][15];//i秒钟在j位置得到的最大馅饼 int mp[maxn][15]; int main() { int maxi,mini; int n,i,j,x,t; while(scanf("%d",&n)!=EOF,n){ mini=maxn; maxi=-1; memset(mp,0,sizeof mp); memset(dp,0,sizeof dp); for(i=0;i<n;i++){ scanf("%d%d",&x,&t); mp[t][x]++; maxi=max(t,maxi); } int ans=-1; //时间, for(i=maxi;i>=0;i--){ //位置 for(j=0;j<=10;j++){ if(j==0) dp[i][0]=max(dp[i+1][0],dp[i+1][1])+mp[i][0]; else dp[i][j]=max(dp[i+1][j],max(dp[i+1][j+1],dp[i+1][j-1]))+mp[i][j]; } } printf("%d\n",dp[0][5]); } return 0; } /* 10 4 2 6 1 7 3 3 3 9 3 9 3 9 3 9 3 9 3 9 3 2 0 6 0 5 */
原文:http://blog.csdn.net/u012377575/article/details/43531623