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 }

 

posted @ 2016-05-20 20:54  pter  阅读(149)  评论(0编辑  收藏  举报