poj 1157 LITTLE SHOP OF FLOWERS(DP)

题确实有点不好读,就是v个花瓶f朵花,v>=f,每个花瓶只能插一束花,可以有空的花瓶,但是花得插完,然后那个二维数组就是每束花在不同花瓶的价值,题目要求最大的价值和。   不用我说,都知道是DP,dp[i][j] = max{ dp[i-1][i-1....j-1] } + val[i][j];dp[i][j]表示第i朵花插在第j个瓶上的最大价值。

附带代码参考。

差点忘记了   千万得考虑所以得价值都是负的情况啊,第一次WA就是这原因。

#include<cstdio>
#include<iostream>
#include<cstring>
#define N 101
using namespace std;
int val[N][N];
int f,v;
int dp[N][N];//前面表示第多少束花,后面表示多少个花瓶。
int main()
{
   cin >> f >> v;
   for(int i=1; i<=f; ++i)
     for(int e=1; e<=v; ++e)
   {
    cin >> val[i][e];
   }
   for(int i=0; i<=v; ++i)
    dp[0][i] = 0;
   for(int i=1; i<=f; ++i)
    for(int j=i; j<=v-(f-i); ++j)
   {
    int ma = -1000000;
    for(int k=i-1; k<=j-1; ++k)
    if(ma < dp[i-1][k])
        ma = dp[i-1][k];
    dp[i][j] = ma + val[i][j];
   }
   int ma = -1000000;
   for(int i=f; i<=v; ++i)
    if(ma < dp[f][i])
    ma = dp[f][i];
   cout << ma <<endl;
    return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值