http://acm.hdu.edu.cn/showproblem.php?pid=2571

就是很普通的根据题意递推了。

不过题意有个坑的地方,有负值。所以初始化必须为-inf。被坑了好长时间。

另外 不知道为什么 define 负数就错的 ,非得 改成 const  int  inf 。以后就这样用吧。

和以前比赛做的那个走格子几乎是同样的。

View Code
#include<iostream>
#include<string.h>
#include<stdio.h>
#include<algorithm>
#define maxn
const int inf=~0U>>1;//利用define 错了 。。。以后用这个
using namespace std;
int dp[25][2000];
int value[25][2000];
int main()
{
    int test;
    int n,m;
    cin>>test;
    while(test--)
    {
        cin>>n>>m;

        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
                cin>>value[i][j];
        }
        for(int i=0;i<=n;i++)
        for(int j=0;j<=m;j++)
        dp[i][j]=-inf;//初始化为0错的,以后注意有负值得情况,必须用-inf,因为是自动得到的

        dp[1][1]=value[1][1];
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                dp[i+1][j]=max(dp[i+1][j],dp[i][j]+value[i+1][j]);
                dp[i][j+1]=max(dp[i][j+1],dp[i][j]+value[i][j+1]);
                for(int k=2;k*j<=m;k++)
                    dp[i][k*j]=max(dp[i][k*j],dp[i][j]+value[i][k*j]);

            }
        }
        printf("%d\n",dp[n][m]);
    }
    return 0;
}
posted on 2012-09-18 23:48  一把刷子  阅读(162)  评论(0编辑  收藏  举报