POJ 1157 动态规划

本文介绍了一种使用动态规划解决特定花瓶摆放问题的方法。该问题要求将不同种类的花放置在不同编号的花瓶中,以达到最大的观赏价值,并且遵循特定的摆放规则。文章详细解释了状态转移方程及其实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:用若干束花和花瓶,每种花装到对应的花瓶中都有一个相应的观赏价值,给出每种花装到每种花瓶中的观赏值,求出能达到的最大观赏价值。另外,每种花和花瓶都有其序号,序号大的花只能放在序号小的花的后面的花瓶中。

 

思路:用dp[i][j]表示将前i束花放到前j个花瓶中的最大观赏价值。枚举最后一束花,最后一束花能放到的位置为k,i<=k<=j,所以状态转移方程是

 

dp[i][j] = max{dp[i-1][k-1] + a[i][k]} (i <= k <= j)

 

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <ctype.h>
#include <cstring>
#include <string>
#include <queue>
#include <cmath>

#define MAXN 110
#define INF 2147000000
#define pu system("PAUSE")

#pragma comment(linker, "/STACK:16777216");

using namespace std;

int f, v;
int a[MAXN][MAXN];
int dp[MAXN][MAXN];
int main()
{
    //freopen("C:/Users/Admin/Desktop/in.txt", "r", stdin);
    while(cin >> f >> v)
    {
        for(int i = 0; i < f; i++)
        for(int j = 0; j < v; j++)
        {
            cin >> a[i][j];
        }

        for(int i = 1; i <= f; i++)
        {
            for(int j = i; j <= v; j++)
            {
                dp[i][j] = -INF;
                dp[1][1] = a[0][0];
                for(int k = i; k <= j; k++)
                {
                    dp[i][j] = max(dp[i][j], dp[i-1][k-1]+a[i-1][k-1]);
                }
            }
        }

        cout << dp[f][v] << endl;
    }
    return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值