zju 2972 Hurdles of 110m(简单的dp)

题目

简单的dp,但是我还是参考了网上的思路,具体我没考虑到的地方见代码

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
#define inf 2100000000
//int min(int a,int b)
//{
//    return a<b? a:b;
//}
int main()
{
    int t,i,j,n,m;
    int t1,t2,t3,f1,f2;
    int dp[310][310];
    int ans;

    scanf("%d",&t);
    while(t--) 
    {
        scanf("%d%d",&n,&m);
        for(i=0;i<=300;i++)
        {
            for(j=0;j<=300;j++)
            {
                dp[i][j]=inf;
            }
        }
        dp[0][m]=0;
        
        for(i=1;i<=n;i++)
        {
            scanf("%d%d%d%d%d",&t1,&t2,&t3,&f1,&f2);
            for(j=0;j<=m;j++)
            {
                if(j-f1>=0)
                    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);
                
                //原来是这个处理有问题,因为最大能量不能大于m,所以凡是能量大于m的,都算在等于m里面
                //if(j+f2<=m)
                //        dp[i][j+f2]=min(dp[i][j+f2],dp[i-1][j]+t3);
                int temp=(j+f2)>m? m:(j+f2);
                dp[i][temp]=min(dp[i][temp],dp[i-1][j]+t3);
            
            }
        }
        ans=inf;
        for(i=0;i<=m;i++)
        {
            ans=ans<dp[n][i]? ans:dp[n][i];
        }

        printf("%d
",ans);
    }
    return 0;
}
//dp[i][j],到达i点剩余体力为j的最快时间
View Code

ps:dp,我要攻下你!

一道又一道,好高兴!
原文地址:https://www.cnblogs.com/laiba2004/p/3651044.html