洛谷P1353 USACO 跑步 Running
2024-10-21 16:33:14
一道入门的dp,首先要先看懂题目要求。
容易得出状态\(dp[i][j]\)定义为i时间疲劳度为j所得到的最大距离
有两个坑点,首先疲劳到0仍然可以继续疲劳。
有第一个方程:
\(dp[i][0]=max(dp[i-1][0],d[i][0])\)
而如果要休息则一定要休息到疲劳值为0才可以停止。
有第二个方程:
\(dp[i][0]=max(dp[i][0], dp[i-j][j])\)意思是i位置疲劳度为0时的最大距离,是i-j位置疲劳值为j时休息j天的最大距离。
而根据题目意思所得到的不休息选择跑步的方程是:
\(dp[i][j] = max(dp[i][j], dp[i - 1][j - 1] + d[i])\)
完善完善转移顺序就可得到程序:
#include <bits/stdc++.h>
#define N 1000101
#define int long long
using namespace std;
int n, m, d[N], dp[10031][531];//第n分钟必须休息到0
signed main()
{
// freopen("data.in", "r", stdin);
scanf("%lld%lld", &n, &m);
for (int i = 1; i <= n; i++)
scanf("%lld", &d[i]);
for (int i = 1; i <= n; i++)
{
dp[i][0] = max(dp[i - 1][0], dp[i][0]);
for (int j = 1; j <= m; j++)
dp[i][j] = max(dp[i][j], dp[i - 1][j - 1] + d[i]);//不休息
for (int j = 1; j <= min(m, n); j++)//休息
dp[i][0] = max(dp[i][0], dp[i - j][j]);//i位置不疲劳的状态的值
}
for (int i = n; i <= n; i++)
printf("%lld ", dp[i][0]);
return 0;
}
最新文章
- MySQL 数据备份与还原
- 封装对Cookie和Session设置或取值的类
- 用JLabel显示时间-- JAVA初学者遇到的一个困难
- VPN指定某个程序,其实是改路由表(赛风支持VPN和SSH和SSH+模式)
- HDU -2100-Lovekey
- 【Ubuntu16.04】 install nginx
- 解决mysql启动失败报1067错误
- linux 运维常用工具表
- Java实现网页抓取的一个Demo
- ACM Find them, Catch them
- Nginx的启动、停止和重启
- 初识springcloud
- js实现浏览器用户信息收集
- IE8 select 动态下拉遇到的问题
- Tomcat连接池配置
- 阿里云堡垒机密钥连接ECS服务器
- Unity Editor(一)OnInspectorGUI的重写与面板的创建
- 深入理解 iOS Rendering Process
- OO课程总结
- 论文笔记:IRGAN——A Minimax Game for Unifying Generative and Discriminative Information
热门文章
- 4、线程池(摘自C#高级编程第7版)
- k8s安装部署问题、解决方案汇总
- 【转载】JAVA SpringBoot 项目打成jar包供第三方引用自动配置(Spring发现)解决方案
- 2019 顺网游戏java面试笔试题 (含面试题解析)
- property Alternative forms propretie
- C#操作mongodb(聚合函数)-分组找出每组的最大值
- 【方法整理】Oracle 获取trace跟踪文件名的几种常用方式
- Cannot assign to read only property &#39;exports&#39; of object &#39;#<;Object>;&#39; ,文件名大小写问题!!!
- windows10 进入BIOS
- uuid简述