poj 3661 Running

题意:给你一个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)

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include <cmath>
 5 #include<stack>
 6 #include<vector>
 7 #include<map>
 8 #include<set>
 9 #include<queue>
10 #include<algorithm>
11 using namespace std;
12
13 int dp[10005][1005];
14 int ans[10005];
15
16 int main()
17 {
18     int n,m;
19     while(cin>>n>>m)
20     {
21         for(int i=1;i<=n;i++)
22             scanf("%d",&ans[i]);
23         memset(dp,0,sizeof(dp));
24
25         for(int i=1;i<=n;i++)
26         {
27             for(int j=1;j<=m;j++)
28                 dp[i][j]=dp[i-1][j-1]+ans[i];
29             dp[i][0]=dp[i-1][0];
30             for(int k=1;k<=m;k++)
31                 if(i-k>=0)
32                     dp[i][0]=max(dp[i][0],dp[i-k][k]);
33         }
34         cout<<dp[n][0]<<endl;
35     }
36     return 0;
37 }
时间: 2024-10-06 12:22:35

poj 3661 Running的相关文章

poj 3661 Running dp

题意: 有n分钟时间,每分钟牛能跑d[i]路程,在每分钟,牛可以选择跑,这样疲劳度会+1,也可以选择不跑,这样疲劳度会-1(最少到0),问n分钟后疲劳度为0时最多能跑多远,注意牛要疲劳度为0才能继续跑. 分析: 设dp[i][j]表示i分钟结束奶牛疲劳度为j时能跑的最远距离,则转移有:dp[i-1][j-1]->dp[i][j]+d[i],dp[i][j]->dp[i+j][0]; 代码: //poj 3661 //sep9 #include <iostream> using na

poj 3661 Running(区间dp)

Description The cows are trying to become better athletes, so Bessie is running on a track for exactly N (1 ≤ N ≤ 10,000) minutes. During each minute, she can choose to either run or rest for the whole minute. The ultimate distance Bessie runs, thoug

[dp] poj 3661 Running

题意: 一只奶牛可以跑n分钟,疲劳度上限是m. 接下来是每分钟可以跑a[i]米. 然后对于每分钟可以选择跑或者休息,跑的话疲劳度增加一点疲劳度. 休息的话每分钟减少一点疲劳,但是如果选择休息,那么必须休息至疲劳度为零. 问n分钟后,疲劳度为0的,所能跑的最远距离. 思路: 水dp,dp[i][j]代表前i分钟疲劳度为j跑的最远距离. 状态转移就是跑或者休息. 代码: #include"cstdlib" #include"cstdio" #include"c

POJ 3661:Running 区间DP

Running 题目链接: http://poj.org/problem?id=3661 题意: 有一只牛在跑步,在第 i 分钟它可以跑Ni米,疲惫值加1(疲惫值初始为0),或者休息一分钟,疲惫值减1(只有疲惫值到了0才能重新开始跑步),当匹配值达到M时它必须休息,且第N分钟结束时牛的疲惫值必须为0,求这只牛最远可以跑几米. 题解: 设dp[i][j]在 i 分钟里疲惫值限制为j的情况下牛可以跑的最远距离.一般情况下这样设就行了,但是因为题目限制只要开始休息就必须休息到疲惫值为0,所以这里将dp

POJ 题目3661 Running(区间DP)

Running Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5652   Accepted: 2128 Description The cows are trying to become better athletes, so Bessie is running on a track for exactly N (1 ≤ N ≤ 10,000) minutes. During each minute, she can

【POJ 3661】Running

Running Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5598   Accepted: 2102 Description The cows are trying to become better athletes, so Bessie is running on a track for exactly N (1 ≤ N ≤ 10,000) minutes. During each minute, she can

POJ 3661 (线性DP)

题目链接: http://poj.org/problem?id=3661 题目大意:牛跑步.有N分钟,M疲劳值.每分钟跑的距离不同.每分钟可以选择跑步或是休息.一旦休息了必须休息到疲劳值为0.0疲劳值也可以花费1分钟去休息.最后疲劳值必须为0,问跑的最大距离. 解题思路: 怎么看都像个随便YY的DP. 用dp[i][j]表示第i分钟,疲劳值为j的最大距离. 首先考虑第i分钟休息问题: ①上次已经疲劳为0,这次又休息.dp[i][0]=dp[i-1][0]. ②上次疲劳为k.dp[i][0]=ma

POJ 3784 - Running Median(动态中位数) 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:http://poj.org/problem?id=3784 题目大意: 依次给出n个数字,求在数据输入过程中的所有中位数.(共有(n+1)/2个) 输入格式: 输入一个数字P(1<=P<=1000),表示数据组数. 对于每组数据,第一行输入数据组号和数字总个数(1<=个数<=9999),中间以一个空格隔开. 接下来每行给出至多10个数字. 输出格式: 对于每组数据,第一行输出数据组号和中位数个数,中间

POJ 3784 Running Median (动态中位数)

题目链接:http://poj.org/problem?id=3784 题目大意:依次输入n个数,每当输入奇数个数的时候,求出当前序列的中位数(排好序的中位数). 此题可用各种方法求解. 排序二叉树方法,每个结点保存以其为根的左右子树中数的个数.如果数据出的够严格,这种方法会被卡的,除非是通过动态调整维持树的高度较小. 排序二叉树的代码如下: #include <cstdio> using namespace std; #define N 20000 struct Node { int v;