HDU 2571

来源:互联网 发布:win10ie无法下载软件 编辑:程序博客网 时间:2024/06/05 14:16
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=1050;const int INF=-99999999;int t,n,m;int k;int x[maxn][maxn],dp[maxn][maxn];int main(){    scanf("%d",&t);    while(t--)    {        scanf("%d%d",&n,&m);        memset(dp,INF,sizeof(dp));        for(int i=1;i<=n;i++)        {            for(int j=1;j<=m;j++)            {                scanf("%d",&x[i][j]);            }        }        for(int i = 0; i<=n; i++)            dp[i][0] = -99999999;        for(int i = 0; i<=m; i++)            dp[0][i] = -99999999;        dp[0][1]=dp[1][0]=0;        for(int i=1;i<=n;i++)        {            for(int j=1;j<=m;j++)            {                dp[i][j]=max(dp[i-1][j],dp[i][j-1]);                for(int k=2;k<=m;k++)                {                    if(j/k==(double)j/k)                    {                        dp[i][j]=max(dp[i][j],dp[i][j/k]);                    }                }                dp[i][j]+=x[i][j];            }        }        printf("%d\n",dp[n][m]);    }    return 0;}
哈哈,这个题目还是很简单的DP了,其实DP的难点就是一开始的思考,对于如何解决问题的思考,如何设置状态转移方程,这个题目的话很容易就可以看出来直接设置成矩阵的形式就可以很轻松的解决了。但是还是要注意这种有点像矩阵啊 或者是这种方阵一般都不以0作为存储的开始  ,而是把1作为开始,并且把0初始化,这样 就便于操作计算了。
0 0
原创粉丝点击