6 5 1 4 1 6 1 7 2 7 2 8 3 0
4
思路:dp[i][j]表示 i 时刻在 x 处能接住的最多馅饼数。dp初始化为0,先计算出i时刻j位置有多少馅饼,这样感觉就转化成数塔问题了,可以倒着时间DP,最后答案就是dp[0][5];也可以正着,最后答案是dp[T][0~10]中的最大值(T是最大时间),正着时要注意控制起点要从5开始。
代码:
//按时间倒着 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <string> #include <map> #include <stack> #include <vector> #include <set> #include <queue> #define maxn 100010 #define MAXN 2005 #define mod 1000000009 #define INF 0x3f3f3f3f #define pi acos(-1.0) #define eps 1e-6 #define lson rt<<1,l,mid #define rson rt<<1|1,mid+1,r #define FRE(i,a,b) for(i = a; i <= b; i++) #define FRL(i,a,b) for(i = a; i < b; i++) #define mem(t, v) memset ((t) , v, sizeof(t)) #define sf(n) scanf("%d", &n) #define sff(a,b) scanf("%d %d", &a, &b) #define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c) #define pf printf #define DBG pf("Hi\n") typedef long long ll; using namespace std; int dp[maxn][12]; int main() { int i,x,t; int n; while (sf(n)&&n) { mem(dp,0); int T=-1; FRL(i,0,n) { sff(x,t); dp[t][x]++; //记录 T=max(T,t); //记录最大时间 } for (i=T;i>=0;i--) //按时间倒着来 { dp[i][0]+=max(dp[i+1][0],dp[i+1][1]); for (int j=1;j<10;j++) dp[i][j]+=max(max(dp[i+1][j-1],dp[i+1][j]),dp[i+1][j+1]); dp[i][10]+=max(dp[i+1][9],dp[i+1][10]); } pf("%d\n",dp[0][5]); } return 0; }
//按时间正着 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <string> #include <map> #include <stack> #include <vector> #include <set> #include <queue> #define maxn 100010 #define MAXN 2005 #define mod 1000000009 #define INF 0x3f3f3f3f #define pi acos(-1.0) #define eps 1e-6 #define lson rt<<1,l,mid #define rson rt<<1|1,mid+1,r #define FRE(i,a,b) for(i = a; i <= b; i++) #define FRL(i,a,b) for(i = a; i < b; i++) #define mem(t, v) memset ((t) , v, sizeof(t)) #define sf(n) scanf("%d", &n) #define sff(a,b) scanf("%d %d", &a, &b) #define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c) #define pf printf #define DBG pf("Hi\n") typedef long long ll; using namespace std; int dp[maxn][12]; int main() { int i,x,t; int n; while (sf(n)&&n) { mem(dp,0); for(i=0;i<12;i++) dp[0][i]=-INF; dp[0][5]=0; //控制起点只从5开始 int T=-1; FRL(i,0,n) { sff(x,t); dp[t][x]++; T=max(T,t); } for (i=1;i<=T;i++) //按时间正着 { dp[i][0]+=max(dp[i-1][0],dp[i-1][1]); for (int j=1;j<10;j++) dp[i][j]+=max(max(dp[i-1][j-1],dp[i-1][j]),dp[i-1][j+1]); dp[i][10]+=max(dp[i-1][9],dp[i-1][10]); } int ans=-1; for (i=0;i<=10;i++) //取最大值为答案 ans=max(ans,dp[T][i]); pf("%d\n",ans); } return 0; }
原文地址:http://blog.csdn.net/u014422052/article/details/44337177