ZOJ 2972Hurdles of 110m(DP)

来源:互联网 发布:用c语言输出99乘法表 编辑:程序博客网 时间:2024/05/02 04:21

题目链接:重点内容http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2972

跨栏跑分为几段,每段有三种跑步方式,不同方式通过每段路程时间不同,并消耗或补充体力,要求输出最短时间。
二维DP

#include<iostream>#include<cstdio>#include<set>#include<string>#include<string.h>#include<cstring>#include<vector>#include<map>#include<queue>#include<stack>#include<cctype>#include<algorithm>#define mt(a) memset(a,0,sizeof a)#define fl(a,b,c) fill(a,b,c)#define inf 1000000000+7using namespace std;typedef long long ll;int ans[200];int dp[200][500];int main(){    int T;    cin >> T;    while (T--)    {        int n, m;        scanf("%d %d", &n, &m);        for (int i = 1; i < 200; i++)            memset(dp[i], inf, sizeof (dp[i]));        memset(dp[0], 0, sizeof(dp[0]));        for (int i = 1; i <= n; i++)        {            int t1, t2, t3, f1, f2;            scanf("%d %d %d %d %d", &t1, &t2, &t3, &f1, &f2);            for (int j = 0; j <= m; j++)            {                if (j >= f1&&dp[i - 1][j] != inf)dp[i][j-f1] = min(dp[i][j-f1], dp[i-1][j] + t1);                dp[i][j] = min(dp[i][j], dp[i - 1][j] + t2);                if (j + f2 >= m)dp[i][m] = min(dp[i][m], dp[i - 1][j] + t3);                else dp[i][j + f2] = min(dp[i][j + f2], dp[i - 1][j] + t3);            }        }        int ans = inf;        for (int i = 0; i <= m; i++)        {            ans = min(ans, dp[n][i]);        }        printf("%d\n", ans);    }    return 0;}
0 0
原创粉丝点击