hdu 1176 免费馅饼 dp

来源:互联网 发布:linux apache cgi 编辑:程序博客网 时间:2024/06/05 05:53

题目链接

思路:

      本人也是刚接触dp,所以这个题用了两种方法,但是一种方法当时发现测试数据好像有点水,我自己举了一个样例不对竟然给我ac了 然后又自己改了一下...

        像这样起点位置确定了而末位置不确定的我们从后往前倒着dp,这样以便确定最优解,

转移方程为 dp[i][j]+=max(dp[i+1][j],max(dp[i+1][j-1],dp[i+1][j+1]));   处理好边界

     

#include<bits/stdc++.h>#define Ri(a) scanf("%d", &a)#define Rl(a) scanf("%lld", &a)#define Rf(a) scanf("%lf", &a)#define Rs(a) scanf("%s", a)#define Pi(a) printf("%d\n", (a))#define Pf(a) printf("%lf\n", (a))#define Pl(a) printf("%lld\n", (a))#define Ps(a) printf("%s\n", (a))#define W(a) while(a--)#define CLR(a, b) memset(a, (b), sizeof(a))#define MOD 100000007using namespace std;typedef long long ll;const int maxn=1e5+10;int dp[maxn][20];int n,pos,t;int maxt; int main(){while(~Ri(n)){if(n==0)break;CLR(dp,0);maxt=-1;for(int i=1;i<=n;i++){Ri(pos),Ri(t);dp[t][pos]++;maxt=max(t,maxt);}for(int i=maxt-1;i>=0;i--){for(int j=0;j<=10;j++){if(j>0&&j<10)dp[i][j]+=max(dp[i+1][j],max(dp[i+1][j-1],dp[i+1][j+1]));else if(j==0)dp[i][j]+=max(dp[i+1][j],dp[i+1][j+1]);elsedp[i][j]+=max(dp[i+1][j],dp[i+1][j-1]);}}Pi(dp[0][5]);}return 0;}

       如果从起始位置开始的话需要注意由于刚开始只能从5这个起点开始,需要特别处理一下;

#include<bits/stdc++.h>#define Ri(a) scanf("%d", &a)#define Rl(a) scanf("%lld", &a)#define Rf(a) scanf("%lf", &a)#define Rs(a) scanf("%s", a)#define Pi(a) printf("%d\n", (a))#define Pf(a) printf("%lf\n", (a))#define Pl(a) printf("%lld\n", (a))#define Ps(a) printf("%s\n", (a))#define W(a) while(a--)#define CLR(a, b) memset(a, (b), sizeof(a))#define MOD 100000007using namespace std;typedef long long ll;const int maxn=1e5+10;int dp[maxn][20];int n,pos,t;int maxt; int main(){while(~Ri(n)){if(n==0)break;CLR(dp,0);maxt=-1;for(int i=1;i<=n;i++){Ri(pos),Ri(t);if(t==1&&pos>=4&&pos<=6)//起始特别处理dp[t][pos]++;else if(t!=1)dp[t][pos]++;maxt=max(t,maxt);}for(int i=2;i<=maxt;i++){for(int j=0;j<=10;j++){if(j>0&&j<10)dp[i][j]+=max(dp[i-1][j],max(dp[i-1][j-1],dp[i-1][j+1]));else if(j==0)dp[i][j]+=max(dp[i-1][j],dp[i-1][j+1]);elsedp[i][j]+=max(dp[i-1][j],dp[i-1][j-1]);}}int ans=-1;for(int i=0;i<=10;i++)ans=max(ans,dp[maxt][i]);Pi(ans);}return 0;}


0 0
原创粉丝点击