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 }