hdu2571-递推的思考-递推的逻辑

来源:互联网 发布:javascript实战 pdf 编辑:程序博客网 时间:2024/05/22 03:54

要睡 了, 先占个坑。明天在更。
交了十几次,我写的这个问题很大的。
正着推是从上上往下推得
我却是逆向的思考
(同我一起想想??)
看了大神的代码才懂了。很神奇的哦–
2017-5-2-晚
11 只能是因子转移,不能是本身,如果不能得到本身。!!
2 dp[0][1]是为了给初始值赋值。避免他在改变。其实一个就行,
3 把0开始的一排和一列全初始化为无穷小,是为了避免出现负数的问题,这样第一排即使是负数也会保留。题目数据不够,只将第一列全初始化也能a。。但是这说明样例的问题。。

#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>using namespace std;const int maxn=25;const int maxm=1002;int main(){   int a[maxn][maxm];    int dp[maxn][maxm];    int t;    int m,n;     scanf("%d",&t);      while(t--)      {   scanf("%d%d",&m,&n);          memset(a,0,sizeof(a));          memset(dp,0,sizeof(dp));          for(int i=1;i<=m;i++)             for(int j=1;j<=n;j++)            scanf("%d",&a[i][j]);           for(int i=1;i<=m;i++)             for(int j=1;j<=n;j++)                dp[i][j]=-9999999;                 dp[1][1]=a[1][1];           //for(int i=2;i<=m;i++)             //dp[i][1]=dp[i-1][1]+a[i][1];           //for(int i=2;i<=n;i++)              //dp[1][i]=dp[1][i-1]+a[1][i];              //for(int i=1;i<=)            for(int i=1;i<=m;i++)              for(int j=1;j<=n;j++)              {                  for(int k=1;j+k*j<=n;k++)                     //k肯定在他前面、                   dp[i][j+k*j]=max(dp[i][j]+a[i][j+k*j],dp[i][j+k*j]);                   dp[i+1][j]=max(dp[i+1][j],dp[i][j]+a[i+1][j]);                   dp[i][j+1]=max(dp[i][j+1],dp[i][j]+a[i][j+1]);              }             printf("%d\n",dp[m][n]);      }    return 0;}
#include<iostream>#include<cstdio>using namespace std;int a[25][1005];int dp[25][1005];int main(){    int tes;    cin>>tes;    while(tes--)    {        int n,m;        cin>>n>>m;        int i,j,k;        for(i=1;i<=n;i++)            for(j=1;j<=m;j++)                scanf("%d",&a[i][j]);        for(int i=0;i<=n;i++)            for(int j=0;j<=m;j++)            dp[i][j]=-9999999;        dp[1][1]=a[1][1];        //dp[0][1]=dp[1][0]=0;     for(int i=2;i<=n;i++)        dp[i][1]=dp[i-1][1]+a[i][1];     for(int i=2;i<=m;i++)        {dp[1][i]=dp[1][i-1]+a[1][i];          for(int k=1;k<i;k++)//for(int k=2;k<=j;k++),下面取 j/k;            if(i%k==0)          {              //printf("%d  %d  %d\n",k,i/k,i);              dp[1][i]=max(dp[1][i],dp[1][k]+a[1][i]);}        }        for(i=2;i<=n;i++)            for(j=2;j<=m;j++)            {                dp[i][j]=max(dp[i-1][j],dp[i][j-1]);    //(x+1,y),(x,y+1)                for(k=2;k<=m;k++)                {                    if(j%k==0)                        dp[i][j]=max(dp[i][j],dp[i][j/k]);   //(x,y*k)                }                dp[i][j]+=a[i][j];            }        cout<<dp[n][m]<<endl;    }    return 0;}


1 0
原创粉丝点击