首页 > 其他 > 详细

poj - 1157 - LITTLE SHOP OF FLOWERS(dp)

时间:2014-10-02 22:35:43      阅读:394      评论:0      收藏:0      [点我收藏+]

题意:F朵花(从左到右标号为1到F,1 <= F <= 100)放入V个花瓶(从左到右标号为1到V,F <= V <= 100),花 i 要放在花 j 的左边,如果i < j,每朵花放入每个花瓶有一个好看度(-50 <= Aij <= 50),求所有花放入花瓶后的最大好看度和。

——>>设dp[i][j]表示将前j种花放入前i个花瓶的最大好看度和,则状态转移方程为:

dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1] + nValue[j][i]);

时间复杂度:O(F * V)

#include <cstdio>
#include <algorithm>

using std::max;

const int MAXN = 100 + 10;

int nValue[MAXN][MAXN];
int dp[MAXN][MAXN];

int F, V;

void Read()
{
    for (int i = 1; i <= F; ++i)
    {
        for (int j = 1; j <= V; ++j)
        {
            scanf("%d", &nValue[i][j]);
        }
    }
}

void Dp()
{
    int nRet = 0;

    dp[0][0] = 0;
    for (int i = 1; i <= V; ++i)
    {
        dp[i][0] = 0;
        for (int j = 1; j <= i && j <= F; ++j)
        {
            dp[i][j] = dp[i - 1][j - 1] + nValue[j][i];
            if (i - 1 >= j)
            {
                dp[i][j] = max(dp[i][j], dp[i - 1][j]);
            }
            if (j == F)
            {
                nRet = max(nRet, dp[i][j]);
            }
        }
    }

    printf("%d\n", nRet);
}

int main()
{
    while (scanf("%d%d", &F, &V) == 2)
    {
        Read();
        Dp();
    }

    return 0;
}



poj - 1157 - LITTLE SHOP OF FLOWERS(dp)

原文:http://blog.csdn.net/scnu_jiechao/article/details/39735947

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!