洛谷P1854 花店橱窗布置
2024-10-21 09:50:51
DP,直接递推比记忆化搜索简单。
定义状态\(dp[i][j]\)为前i行最后一个选择第i行第j个数所得到最大值。
易得状态转移方程
\(dp[i][j]=max(dp[i-1][k]+a[i][j])\)
这个题比较困难的就是在\(j\)和\(k\)的枚举上。\(j\)要满足选\(j\)的时候一定要比\(i\)大,比\((m-(n-i))\)小,只有这样才能使前i朵花都可选,后i朵花都可选。而k因为在上一行,所以只需要比j小就好。
#include <bits/stdc++.h>
using namespace std;
const int _INF = -2054847099;
int n, m, maxn;
int a[1001][1001];
//dp[i][j]是必须选择第i,j个数的最大值。
int dp[1001][1001], pre[1001][1001];
int main()
{
memset(dp, -123, sizeof(dp));
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
scanf("%d", &a[i][j]);
for (int i = 1; i <= m; i++)
dp[1][i] = a[1][i];
for (int i = 2; i <= n; i++)
for (int j = i; j <= m - (n - i); j++)
{
for (int k = 1; k < j; k++)
{
if (dp[i][j] < dp[i - 1][k] + a[i][j])
{
dp[i][j] = dp[i - 1][k] + a[i][j];
pre[i][j] = k;
}
}
}
int maxn = 0, maxk;
for (int i = 1; i <= m; i++)
if (maxn < dp[n][i])
{
maxn = dp[n][i];
maxk = i;
}
printf("%d\n", maxn);
stack <int> s;
s.push(maxk);
while (n)
{
maxk = pre[n--][maxk];
s.push(maxk);
}
s.pop();
while (s.size())
{
printf("%d ", s.top());
s.pop();
}
return 0;
}
最新文章
- 两种PHP生成二维码的方法
- MySQL绿色版安装(mysql-5.7.12-win32)
- HTML之总结
- 关于cnas培训
- Epoll,Poll,Select模型比较
- HTTP请求中浏览器缓存
- ext中处理Combobox组件点击触发后台事件的问题
- Java实现Map集合二级联动
- 自己实现的typeOf函数1
- 3d-tiles、gltf 坐标系
- mysql 数据可视化操作---Navicat安装及简单使用
- 后台获取url里面加密的参数中,特殊符号+获取到后端后是 一个空格的解决方法
- P2261 [CQOI2007]余数求和 (数论)
- [ASP.NET]static变量和viewstate的使用方法
- win7+opencv3.0.0+vs2010 安装及配置
- leetcode127
- UI5-文档-4.9-Component Configuration
- JavaScript(select onchange)的网页跳转的简单实现
- LInux下inode空间报警-CROND出错导致/var/spool/postfix/maildrop/堆积
- git-----初始化配置添加用户名和密码
热门文章
- 切换GCC编译器版本
- Spring-Cloud之Eureka注册与发现-2
- 2.NET Core设定数据库种子
- WebServices 使用Session
- Python进阶(十)----软件开发规范, time模块, datatime模块,random模块,collection模块(python额外数据类型)
- nodeJS实现简易爬虫
- 关于定义变量名为";name";的坑!!!
- QuickStart系列:docker部署之Gitlab本地代码仓库
- angularcli 第七篇(service 服务)
- C语言基础知识-程序流程结构