花店橱窗布置

本文介绍了一种使用动态规划解决特定插花问题的方法。通过建立动态转移方程,求解最优解,并给出了完整的C++代码实现。文章还提供了一个打印出最优解路径的函数。

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

题目大意

解题思路:

不就是插花吗?
求出动态转移方程,很容易啊。
直接列出动态转移方程。
**b[i][j]=max(b[i][j],b[i-1][k-1]+a[i][k]);
i=1..f;j=i..v-f+i;k=i..j;**
#include <cstdio>
#include <cstring>
#define r(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
int a[101][101],b[101][101],c[101],f,v,e;
void read(int &f)//装b输入(会快很多)
{
    f=0;bool d=0;char c;
    while (c=getchar(),c<'0'||c>'9') if (c=='-') d=1;f=f*10+c-48;
    while (c=getchar(),c>='0'&&c<='9') f=f*10+c-48;
    if (d) f*=-1;
}
void write(int x)//装b输出(会快很多)
{
    if (x<0) {x=-x;putchar('-');}
    if (x) write(x/10);else return;
    putchar(x%10+48);
}
int max(int x,int y)//iostream 库里有,但是自己打会快一些
{
    return  x>y?x:y;
}
void print(int i,int j)//输出分别插第几个花瓶
{
    int n;
    if(i>0)
    {
        n=i;
        while (b[i][n]!=j)
         n++;
        print(i-1,j-a[i][n]);
        write(n);putchar(32);
    }
}
int main()
{
    e=-2147483647;//因为是找最大值,而且有负数,所以不能定义为0
    read(f);read(v);
    r(i,1,f)
     r(j,1,v)
      read(a[i][j]);//读入
    memset(b,128,sizeof(b));//初始化
    r(i,0,100) b[0][i]=0;//初始化
    r(i,1,f)
     r(j,i,v-f+i)
      r(k,i,j)
       b[i][j]=max(b[i][j],b[i-1][k-1]+a[i][k]);//更新最优值
    r(i,f,v)
     e=max(e,b[f][i]);//选择全局最优解
    if (!e) putchar(48);else
    write(e);
    putchar(10);
    print(f,e);//根据最优解求出花插在哪个花瓶
    return 0;
}

可能做的不好的地方较多,大佬勿喷

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值