https://codeforces.com/problemset/problem/1077/F1

这个其实是一个比较简单的dp了

题目大意:

给你n个数,让你从n个数里选出x个数,并且每隔k个至少选一个数。

开始不知道怎么去写,也不知道怎么去定义dp

这个应该是对于dp不是特别的熟练,实际上dp用途很广,而且可以用到的地方很多,效果也很好。

这种时候就应该大胆一点,你需要什么,想达成什么效果那就去这样定义。

这个题目,我们希望dp可以帮我们解决前面n个数,选了x个数的最大和,而且这个还必须每隔k就选择了一个数。

这个是大问题,子问题是什么呢?

如果我们选第i个数,那么前面n-1个数,选了x-1个数的最大和。。。。

否则就是我们不选第i个数,那么前面n-1个数,选了x个数的最大和。  ----这种情况我们最多可以向前面推k-1次

所以我们要怎么定义呢?

首先要有一维来记录到第几个数了,还有一维就是要记录我们选了多少个了,

两维记录可以唯一确定每一个状态,所以两维就够了

那到底怎么去定义这个dp呢?dp的含义是什么呢?

这个我觉得不是很好想。

dp[i][j]表示前面i个数,已经选了j个数的最大和吗?

但是因为这个有区间限制,就是每隔k就必须有一个数,所以这个时候我们就要确定前面的那个值的位置,

所以我们就定义为已经选择了第i个数,前面i个数 选了j个数的最大和。

状态定义好了之后,就是转移方程的确定了。

dp[i][j]=max(dp[i][j],dp[s][j-1]+a[i])

这个s其实就是i往前推,然后去最大值,所以需要三维。

而且这个往前推最多推k个数。

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <algorithm>
#include <vector>
#include <iostream>
#define inf 0x3f3f3f3f3f3f3f3f
using namespace std;
const int maxn = ;
typedef long long ll;
ll dp[ * maxn][ * maxn];
ll a[maxn]; int main()
{
int n, k, x;
scanf("%d%d%d", &n, &k, &x);
for (int i = ; i <= n; i++) scanf("%lld", &a[i]);
for(int i=;i<=n;i++)
{
for(int j=;j<=x;j++)
{
dp[i][j] = -inf;
}
}
dp[][] = ;
for(int i=;i<=n;i++)
{
for(int j=;j<=x;j++)
{
for(int h=;h<=k&&h<=i;h++)
{
if (dp[i - h][j - ] == -inf) continue;
dp[i][j] = max(dp[i][j], dp[i - h][j - ] + a[i]);
// printf("dp[%d][%d]=%lld\n", i, j, dp[i][j]);
}
}
}
ll ans = -inf;
for (int i = n - k + ; i <= n; i++) ans = max(ans, dp[i][x]);
if (ans < ) printf("-1\n");
else printf("%lld\n", ans);
return ;
}

线性dp

最新文章

  1. 从零开始编写自己的C#框架(12)——T4模板在逻辑层中的应用(一)(附源码)
  2. 原生js与jquery操作iframe
  3. JSP页面和属性命名规范
  4. 分享个win平台cocos2d-x创建项目的快捷方式
  5. asp.net 中的app_offline.htm的使用
  6. Flex弹性布局在移动设备上的应用
  7. Dx unsupported class file version 52.0
  8. 备份U盘分区表,未雨绸缪
  9. cmd批处理常用符号详解
  10. css3 keyframes animation
  11. 使用RX方式模拟DoubanFm的登陆
  12. 每天学点linux命令--tail,cut,sort,uniq
  13. jquery编写插件
  14. T4 模板 vs2010
  15. hdu4597 Play Game
  16. Mysql 范围查询优化
  17. eclipse 导入gradle引入多模块项目,引入eclipse后变成了好几个工程
  18. Javascript DOM(2)
  19. laravel创建项目
  20. Gevent 性能和 gevent.loop 的运用和带来的思考

热门文章

  1. Bat 脚本学习 (基础篇)
  2. SpringMVC中利用HandlerExceptionResolver完成异常处理
  3. python干货-类属性和方法,类的方法重写
  4. Sprint 3 : oxford project API 尝试
  5. G. 蚂蚁的镜像串
  6. 基于canvas的画板
  7. .NET中 kafka消息队列、环境搭建与使用
  8. Lesson0423
  9. /uesr/local/hadoop/tmp/mapred有锁
  10. Xshell下载和连接Linux