题目

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;
}

最新文章

  1. 两种PHP生成二维码的方法
  2. MySQL绿色版安装(mysql-5.7.12-win32)
  3. HTML之总结
  4. 关于cnas培训
  5. Epoll,Poll,Select模型比较
  6. HTTP请求中浏览器缓存
  7. ext中处理Combobox组件点击触发后台事件的问题
  8. Java实现Map集合二级联动
  9. 自己实现的typeOf函数1
  10. 3d-tiles、gltf 坐标系
  11. mysql 数据可视化操作---Navicat安装及简单使用
  12. 后台获取url里面加密的参数中,特殊符号+获取到后端后是 一个空格的解决方法
  13. P2261 [CQOI2007]余数求和 (数论)
  14. [ASP.NET]static变量和viewstate的使用方法
  15. win7+opencv3.0.0+vs2010 安装及配置
  16. leetcode127
  17. UI5-文档-4.9-Component Configuration
  18. JavaScript(select onchange)的网页跳转的简单实现
  19. LInux下inode空间报警-CROND出错导致/var/spool/postfix/maildrop/堆积
  20. git-----初始化配置添加用户名和密码

热门文章

  1. 切换GCC编译器版本
  2. Spring-Cloud之Eureka注册与发现-2
  3. 2.NET Core设定数据库种子
  4. WebServices 使用Session
  5. Python进阶(十)----软件开发规范, time模块, datatime模块,random模块,collection模块(python额外数据类型)
  6. nodeJS实现简易爬虫
  7. 关于定义变量名为&quot;name&quot;的坑!!!
  8. QuickStart系列:docker部署之Gitlab本地代码仓库
  9. angularcli 第七篇(service 服务)
  10. C语言基础知识-程序流程结构