【习题】【线性dp】AcWing 313.花店橱窗(附带闫氏dp分析法)

本文介绍了一种解决AcWing平台313号问题——花店花瓶价值分配的线性动态规划方法。作者详细解释了闫氏dp分析法,并提供了C++代码实现,着重讲解了处理i等于j特殊情况的方法。同时,博客还分享了作者的联系方式和个人公众号资源,适合算法爱好者和动态规划初学者阅读。

Question:AcWing 313.花店橱窗

Question Link:acwing.com/problem/content/315

Question Algorithm:线性DP

Question Difficulty Level:★☆☆☆☆

Question Analysis:

闫氏dp分析法:

AcWing 313.花店橱窗_闫氏DP分析法.png

在状态计算的时候我把 j>ij>ij>i 的情况画在了椭圆里,把 i=ji=ji=j 的情况写在了外面

Code:

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int w[110][110];//w[i][j]表示第i朵花在第j个花瓶的价值
int dp[110][110];//dp[i][j]表示前i朵花放在前j个花瓶的总价值的最大值
int f,v;
long long res=0;
void print(int i,int j)
{
    if(i==0||j==0)return ;
    while(dp[i][j]==dp[i][j-1]) j--;
    print(i-1,j-1);
    cout<<j<<" ";
}
int main()
{
    
    cin >> f >> v;
    for (int i = 1; i <= f; i ++ )
        for (int j = 1; j <= v; j ++ )
            cin >> w[i][j];
    for (int i = 1; i <= f; i ++ )
        for (int j = i; j <= v; j ++ )
        {
            if(i==j) dp[i][j]=dp[i-1][j-1]+w[i][j];
            //如果没有考虑i==j的情况,若此时dp[i-1][j-1]+w[i][j]为负,而dp[i][j-1]初始为0,则状态错误!
            else dp[i][j]=max(dp[i][j-1],dp[i-1][j-1]+w[i][j]);
        }
            
    cout << dp[f][v] << endl;        
    print(f,v);
    return 0;   
}

如有疑问欢迎在评论区留言或者通过Email联系我

My Email:Wizzy-Ang@qq.com

欢迎大家关注我的个人公众号WizzyAngShare,(还有个人博客)

我会在这里分享编程语言语法,算法,及区块链的相关知识,还有各种奇奇怪怪的小知识等着你~

QRCode
虽然现在这个公众号有亿点草率 ,我会努力更新的~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值