HDOJ 2571 命运

来源:互联网 发布:淘宝水印logo设计 编辑:程序博客网 时间:2024/05/29 17:39
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2571

 

题目为DP中的水题,有前面向往后递推……

#include

#include

using namespace std;

const int INF=-100000000;

int n,m;

int a[22][1002];

inline int max(int a,int b){

   return a>b?a:b;

}

int main(){

   int t,i,j,k;

   cin>>t;

   while(t--){

       cin>>n>>m;

       for(i=1;i<=n;i++){

           for(j=1;j<=m;j++){

               a[i][j]=INF;

           }

       }

       a[1][1]=0;

       for(i=1;i<=n;i++){

           for(j=1;j<=m;j++){

               cin>>k;

               a[i][j]+=k;

               a[i][j+1]=max(a[i][j+1],a[i][j]);

               a[i+1][j]=max(a[i+1][j],a[i][j]);

               for(int o=2;o*j<=m;o++){

                   a[i][o*j]=max(a[i][j*o],a[i][j]);

               }

           }

       }

       cout<<a[n][m]<<endl;

   }

   return 0;

}

深搜也可以的,

#include

#include

#include

using namespace std;

const int INF=-100000000;

int n,m;

int a[22][1002];

bool b[22][1002];

inline int max(int a,int b){

   return a>b?a:b;

}

int DFS(int c,int d){

   if(b[c][d]||c==n&&d==m){

       return a[c][d];

   }

   int mx=INF;

   if(c+1<=n){

       mx=max(mx,DFS(c+1,d));

   }

   if(d+1<=m){

       mx=max(mx,DFS(c,d+1));

   }

   for(int k=2;k*d<=m;k++){

       mx=max(mx,DFS(c,k*d));

   }

   a[c][d]+=mx;

   b[c][d]=true;

   return a[c][d];

}

int main(){

   int t,i,j,k;

   scanf("%d",&t);

   while(t--){

       scanf("%d%d",&n,&m);

       memset(a,0,sizeof(a));

       memset(b,false,sizeof(b));

       for(i=1;i<=n;i++){

           for(j=1;j<=m;j++){

               scanf("%d",&a[i][j]);

           }

       }

       printf("%d\n",DFS(1,1));

   }

   return 0;

}

0 0
原创粉丝点击