HDOJ 2571 命运 解题报告

    动态规划,简单题。

    每次走,从(x,y)到(x+1,y)或(x,y+1)或(x,y*k)(k>1 && y*k<=m)。每次就有三种选择,而我们要选择令和最大的路径。

    动态规划的原则,结果最优,则子结果也是最优的,对于每个位置(x,y),我们求最大值,即取(x-1,y),(x,y-1),(x,y/k)三个位置的最大值。(x-1,y),(x,y-1)很容易处理,对于(x,y/k),我们可以在处理每个位置后,对他的y整数倍位置进行赋值,比他大则更新。额。。。看代码更清楚。

#include <iostream>
using namespace std;

int dp[22][1002];

int maxOfThree(int a,int b,int c)
{
    return a>b?(a>c?a:c):(b>c?b:c);
}

int main()
{
    int cas,i,j,k,m,n,t;
    cin>>cas;
    while(cas--)
    {
        cin>>n>>m;
        for(i=0;i<=n;i++)
            for(j=0;j<=m;j++)
                dp[i][j]=-110;
        dp[1][1]=0;
        for(i=1;i<=n;i++)
            for(j=1;j<=m;j++)
            {
                cin>>t;
                dp[i][j]=t+maxOfThree(dp[i][j],dp[i-1][j],dp[i][j-1]);
                for(k=2;k*j<=m;k++)
                    if(dp[i][k*j]<dp[i][j])
                        dp[i][k*j]=dp[i][j];
            }
            cout<<dp[n][m]<<endl;
    }
}

    之前初始化时直接memset,都赋值为0,所以一直wrong。后来索性两循环,全部赋值-110。

    网上搜到的代码基本是建了两个二维数组,一个存输入,一个存和,其实一个就够了。

    这题告诉我的另一件事是,0是个奇怪的东西,数无限,却因0而分正负。主观意识中,0和正数的感觉总是比负数好。零下几度的天气会很冷,负的增长率是损失,这种正数比负数好的感觉就像刻在脑子里一样,挥之不去。对抽象的东西因为主观意识产生偏见,就是对真理的不尊重啊。以此为戒

posted @ 2013-02-07 19:21  SF-_-  阅读(277)  评论(0编辑  收藏  举报