6 5 1 4 1 6 1 7 2 7 2 8 3 0
4
分析:
设a[i][j]为第i秒的j位置掉下的馅饼数量,f[i][j]为第i秒在j位置接馅饼最多可以接到的最多馅饼数量。由于每秒只能移动一个位置,因此这一状态可能由三种情况达到:
这三种情况中的最大值加上当前位置可以接到的馅饼数即是当前位置可以接到的最大馅饼数量:
DP为: f [ i ] [ j ] = max ( f [ i - 1 ] [ j - 1 ] , f [ i - 1 ] [ j ] , f [ i - 1 ] [ j + 1 ] ) + a [ i ] [ j ] ;
#include <cstdio> #include <iostream> #include<cstring> using namespace std; int a[100001][12]; int f[100001][12]; int main() { int T; while(scanf("%d",&T)!=EOF&&T) { memset(a,0,sizeof(a)); memset(f,0,sizeof(f)); int x,t,i,j,maxn=0,ans=0; while(T--) { scanf("%d%d",&x,&t); ++a[t][x]; maxn=max(maxn,t); } f[1][4]=a[1][4]; f[1][5]=a[1][5]; f[1][6]=a[1][6]; for(i=2;i<=maxn;i++) { for(j=0;j<11;j++) { f[i][j]=f[i-1][j]; if(j>0) //除去j=0 f[i][j]=max(f[i][j],f[i-1][j-1]); //除去j=10 if(j<10) f[i][j]=max(f[i][j],f[i-1][j+1]); f[i][j]=f[i][j]+a[i][j]; } } for(i=0;i<11;i++) ans=max(ans,f[maxn][i]); printf("%d\n",ans); } return 0; }
原文:http://www.cnblogs.com/fenhong/p/5294922.html