HDU 2845 dp

来源:互联网 发布:心理知乎 编辑:程序博客网 时间:2024/06/18 12:21

2014/9/23


一道很水的dp,我之所以wa了五六次是因为:一开始题目没读明白(不知道i 行选了,i- 1和i + 1行就不能选= =还以为是一个个选的)

然后就是算行的时候参数n写成了参数m 。。。wtf 


#include<stdio.h>#include<string.h>#include<cmath> #include<algorithm>#include<iostream>#include<queue>#include<stack>#include<map>#include<climits>#include<vector>using namespace std;typedef long long ll;  #define f(x,y,i) for(int i = x;i < y; i++)#define ff(x,y,i) for(int i = x;i  <= y; i++)#define F(x,y,i) for(int i = x; i >= y; i--)#define FF(x,y,i) for(int i = x; i > y; i++)#define lson pos<<1,l,mid#define rson pos<<1|1,mid+1,r#define sc(n) scanf("%d",&n)#define pr(n) printf("%d\n",n)#define met(n,m) memset(n, m, sizeof(n)) #define mod 10007int Max(int a,int b){    return a>b?a:b;}int Min(int a,int b){    return  a<b?a:b;}const int N=200050;int dp[N][2];int s[N];int ans[N];int main(){    int n, m;   while(~scanf("%d%d",&n,&m))   {   ans[0]=s[0]=0;     f(1,n+1,i)     {         f(1, m+1 ,j)         scanf("%d",&s[j]);         dp[0][0]=0;         dp[0][1]=0;         dp[1][0]=0;         //met(dp,0);         dp[1][1]=s[1];                  f(2,m+1,j)         {           dp[j][0]=Max(dp[j-1][1],dp[j-1][0]);           dp[j][1]=dp[j-1][0]+s[j];           //printf("%d %d\n",dp[j][1],dp[j][0]);         }         ans[i]=Max(dp[m][0],dp[m][1]);     }                      dp[0][0]=0;         dp[0][1]=0;         dp[1][0]=0;         //met(dp,0);     dp[1][1]=ans[1];     f(2, n+1, i)     {         dp[i][0]=Max(dp[i-1][1],dp[i-1][0]);         dp[i][1]=dp[i-1][0]+ans[i];     }              printf("%d\n",Max(dp[n][1],dp[n][0]));     }      return 0;}


0 0