poj 3661 Running (dp)
2014-12-10 15:23
295 查看
题意:
给你一个n,m,n表示有n分钟,每i分钟对应的是第i分钟能跑的距离,m代表最大疲劳度,每跑一分钟疲劳度+1,当疲劳度==m,必须休息,在任意时刻都可以选择休息,如果选择休息,那么必须休息到疲劳度为0,当然,当疲劳度为0的时候也是可以继续选择休息的,求在n分钟后疲劳度为0所跑的最大距离。
题解:
状态:dp[i][j] 第i分钟疲劳度为j的时候走的最大距离
注意:分情况讨论。
给你一个n,m,n表示有n分钟,每i分钟对应的是第i分钟能跑的距离,m代表最大疲劳度,每跑一分钟疲劳度+1,当疲劳度==m,必须休息,在任意时刻都可以选择休息,如果选择休息,那么必须休息到疲劳度为0,当然,当疲劳度为0的时候也是可以继续选择休息的,求在n分钟后疲劳度为0所跑的最大距离。
题解:
状态:dp[i][j] 第i分钟疲劳度为j的时候走的最大距离
注意:分情况讨论。
/* 状态: dp[i][j]表示“开区间”内的数都被取走了所得的最大值,开区间着重号!容易错! */ #include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> #include<math.h> using namespace std; typedef long long lld; #define oo 0x3f3f3f3f #define maxn 10000+5 #define maxm 500+5 int dp[maxn][maxm]; int d[maxn]; int main() { int n,m; while(scanf("%d %d",&n,&m)!=EOF) { for(int i=1;i<=n;i++) scanf("%d",&d[i]); memset(dp,-1,sizeof dp); dp[1][0]=0; dp[1][1]=d[1]; for(int i=1;i<n;i++) { for(int j=0;j<=m;j++) { if(dp[i][j]==-1) continue; if(j+1<=m) dp[i+1][j+1]=max(dp[i+1][j+1],dp[i][j]+d[i+1]); if(j==0) dp[i+1][0]=max(dp[i+1][0],dp[i][0]); if(0<j&&i+j<=n) dp[i+j][0]=max(dp[i+j][0],dp[i][j]); } } printf("%d\n",dp [0]); } return 0; }
相关文章推荐
- poj 3661 Running (DP)
- poj 3661 dp(Running)
- poj 3661 Running (区间DP)
- POJ-3661 Running (线性状态dp)
- POJ 3661 Running (DP)
- POJ 3661-Running(DP)
- POJ 3661 Running(区间DP)
- POJ 3661 Running(区间dp)
- poj 3661 Running(dp,设计状态,)
- poj 3661 Running(区间dp)
- POJ 3661 Running(朴素DP)
- poj 3661 Running(dp)
- POJ 3661 Running (DP思想)
- Poj 3661 Running(DP)
- [dp] poj 3661 Running
- POJ-3661 Running(dp)
- POJ 3661 Running(区间DP)
- POJ 3661 Running(dp)
- POJ 3661 Running(区间DP)
- poj 3661 Running(区间dp)