poj-3661-二维dp

来源:互联网 发布:一分钟心理学 知乎 编辑:程序博客网 时间:2024/06/05 15:40

题意:

运动员跑n分钟,每分钟的疲劳度都不能超过m;

每分钟可以选择跑,或者休息。

第i分钟,如果跑的话,可以跑d[i]距离,疲劳度+1,如果休息的话,疲劳度-1。

问当n分钟过后,运动员疲劳度为0的情况下最多可以跑多少距离。

注意:如果休息的话,必须休息到疲劳度为0的时候,才可以继续跑。

做法:

设立数组:dp[i][j] 代表第i分钟疲劳度为j的时候跑的距离。

dp[i][j]=dp[i-1][j-1]+d[i];

dp[i][0]=dp[i-k][k];

输出dp[n][0]即可。

#include<stdio.h>#include<iostream>#include<string.h>#include<algorithm>#include<queue>#include<stack>#include<map>#include<string>#include<stdlib.h>#define INF_MAX 0x7fffffff#define INF 999999#define max3(a,b,c) (max(a,b)>c?max(a,b):c)#define min3(a,b,c) (min(a,b)<c?min(a,b):c)#define mem(a,b) memset(a,b,sizeof(a))using namespace std;struct node{    int u;    int v;    int w;    bool friend operator < (node a, node b){        return a.w < b.w;    }}edge[1001];int gcd(int n,int m){if(n<m) swap(n,m);return n%m==0?m:gcd(m,n%m);}int lcm(int n,int m){if(n<m) swap(n,m);return n/gcd(n,m)*m;}int dp[10001][501];int main(){    int n,m,i,j,k;    int d[10001];    scanf("%d%d",&n,&m);    for(i=1;i<=n;i++)    {        scanf("%d",&d[i]);    }    for(j=0;j<=m;j++)dp[0][j]=0;    for(i=1;i<=n;i++)    {        for(j=1;j<=m;j++)        {            dp[i][j]=dp[i-1][j-1]+d[i];        }        dp[i][0]=dp[i-1][0];        for(k=i-1;k>=0&&(i-k)<=m;k--)        {            dp[i][0]=max(dp[i][0],dp[k][i-k]);        }    }    printf("%d\n",dp[n][0]);    return 0;}