poj 3661 Running
2016-05-20 20:54
267 查看
题意:给你一个n,m,n表示有n分钟,每i分钟对应的是第i分钟能跑的距离,m代表最大疲劳度,每跑一分钟疲劳度+1,当疲劳度==m,必须休息,在任意时刻都可以选择休息,如果选择休息,那么必须休息到疲劳度为0,当然,当疲劳度为0的时候也是可以继续选择休息的,求在n分钟后疲劳度为0所跑的最大距离
思路:dp[i][j]表示在第i分钟疲劳度为j的时候所跑的最大距离,dp[i][j]=dp[i-1][j-1]+d[i];这个转移,说的是,第i分钟选择跑步,当然,第i分钟可以选择不跑步,那么就是选择休息,题目说了,选择休息的话必须要休息到疲劳度为0才可以跑,那还有一点,当疲劳度为0了,还是选择继续休息呢?dp[i][0]=dp[i-1][0];
选择休息,那么疲劳度到0了,这一点的最大距离怎么做呢?dp[i][0]=max(dp[i][0],dp[i-k][k]) (0<k<=m&&i-k>0)
思路:dp[i][j]表示在第i分钟疲劳度为j的时候所跑的最大距离,dp[i][j]=dp[i-1][j-1]+d[i];这个转移,说的是,第i分钟选择跑步,当然,第i分钟可以选择不跑步,那么就是选择休息,题目说了,选择休息的话必须要休息到疲劳度为0才可以跑,那还有一点,当疲劳度为0了,还是选择继续休息呢?dp[i][0]=dp[i-1][0];
选择休息,那么疲劳度到0了,这一点的最大距离怎么做呢?dp[i][0]=max(dp[i][0],dp[i-k][k]) (0<k<=m&&i-k>0)
#include<iostream> #include<cstdio> #include<cstring> #include <cmath> #include<stack> #include<vector> #include<map> #include<set> #include<queue> #include<algorithm> using namespace std; int dp[10005][1005]; int ans[10005]; int main() { int n,m; while(cin>>n>>m) { for(int i=1;i<=n;i++) scanf("%d",&ans[i]); memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) dp[i][j]=dp[i-1][j-1]+ans[i]; dp[i][0]=dp[i-1][0]; for(int k=1;k<=m;k++) if(i-k>=0) dp[i][0]=max(dp[i][0],dp[i-k][k]); } cout<<dp [0]<<endl; } return 0; }
相关文章推荐
- C++的继承
- 一个web服务器部署多个项目知多少?
- Android录音播放、停止
- 感知机学习算法初步1
- (OK) Spend Leap Day with TACO + VS Code (visual studio code) - Cordova
- C语言编译原理简介
- Bootloader的分区和启动
- Struts2中 Result类型配置详解一+++++struts.xml配置详解二
- MySQL数据库存储引擎
- 扩展欧几里德求逆元 hdoj 1576
- CentOS系统搭建Nginx负载均衡
- bzoj 2326: [HNOI2011]数学作业
- java字符串抉择
- Android学习记录(十六) recyclerview 滑动慢的问题。
- 差分隐私若干基本知识点介绍(一)
- UI进阶 即时通讯之卸载Openfire
- Java之四 表达式和流程控制
- Java之四 表达式和流程控制
- 大数定律
- 快速幂算法