【题解】Luogu P1854 花店橱窗布置 dp+输出方案
首先转化题意
给定一个n∗m的矩形,每行取一个数使得取出的数总和最大
满足
1.每行取出的数在上一行取出的数的右边
2.每一行取走的数的列数大于该行的行数
3.每一行能取的最大花瓶数小于等于m−(n−当前行数)
转移
设f[i][j]表示从第一行到第i行选择第j个的最大价值
转移方程显然 f[i][j]=max(f[i][j],f[i−1][k]+a[i][j])i−1<k<j
输出方案
参考了神仙siilhouette的做法
从最后的状态每次往前推输出方案
code

1 #include <bits/stdc++.h> 2 using namespace std; 3 namespace gengyf{ 4 #define ll long long 5 const int maxn=5e4+10; 6 const int mod=1e9; 7 inline int read(){ 8 int f=1,x=0;char s=getchar(); 9 while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();} 10 while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();} 11 return f*x; 12 } 13 int n,m,a[110][110],f[110][110],ans; 14 void dfs(int x,int y){ 15 if(x>0){ 16 int k=x; 17 while(f[x][k]!=y)k++; 18 dfs(x-1,y-a[x][k]); 19 printf("%d ",k); 20 } 21 } 22 int main(){ 23 n=read();m=read(); 24 for(int i=1;i<=n;i++) 25 for(int j=1;j<=m;j++){ 26 a[i][j]=read(); 27 } 28 memset(f,128,sizeof(f)); 29 f[0][0]=0; 30 for(int i=1;i<=n;i++) 31 for(int j=1;j<=m;j++){ 32 for(int k=i-1;k<j;k++){ 33 f[i][j]=max(f[i][j],f[i-1][k]+a[i][j]); 34 } 35 } 36 for(int i=n;i<=m;i++){ 37 ans=max(ans,f[n][i]); 38 } 39 printf("%d\n",ans); 40 dfs(n,ans); 41 return 0; 42 } 43 } 44 signed main(){ 45 gengyf::main(); 46 return 0; 47 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述