zoukankan      html  css  js  c++  java
  • zoj 2972 Hurdles of 110m

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2972

    一开始以为是那种类似加血的题目,但是这个题和加血的有个区别就是,是每一段有一个速度值,表示成加血的那样的状态有点复杂。

    所以,表示成简单一点的

    dp[i][j]表示到达第i段还剩j的force。

    所以显然根据题目所说的:

    有状态转移方程:

    dp[i][j]=min(dp[i-1][j]+t2,dp[i][j]); 

    if(j>=f1)
    dp[i][j-f1]=min(dp[i-1][j]+t1,dp[i][j-f1]);
    int temp=j+f2;
    if(temp>m)temp=m;
    dp[i][temp]=min(dp[i][temp],dp[i-1][j]+t3);

    View Code
    #include<iostream>
    #include<string.h>
    #include<algorithm>
    #include<stdio.h>
    #define maxn 200
    using namespace std;
    const int inf=10000;
    int dp[maxn][maxn];
    int main()
    {
        int test;
        int n,m;
        int t1,t2,t3,f1,f2;
        for(cin>>test;test;test--)
        {
            cin>>n>>m;
            fill(dp[0],dp[n+1],inf);//fill函数要注意
            dp[0][m]=0;
            for(int i=1;i<=n;i++)
            {
                cin>>t1>>t2>>t3>>f1>>f2;
                for(int j=m;j>=0;j--)
                {
                    dp[i][j]=min(dp[i-1][j]+t2,dp[i][j]);//普通方式走
                    if(j>=f1)
     dp[i][j-f1]=min(dp[i-1][j]+t1,dp[i][j-f1]);//力气够,最大速度走
                    int temp=j+f2;
                    if(temp>m)temp=m;//不能超过最大值
             dp[i][temp]=min(dp[i][temp],dp[i-1][j]+t3);//最慢力气走
                }
            }
     cout<<*min_element(dp[n],dp[n]+m+1)<<endl;//这个函数要注意
        }
        return 0;
    }



  • 相关阅读:
    c++程序—冒泡排序法(函数、指针)
    c++程序—统计成绩
    c++程序—冒泡排序法
    c++程序—逆置
    c++程序—五只小猪称体重
    c++程序—goto
    c++程序—乘法表
    c++程序—循环嵌套
    RGB保存 .bmp文件踩坑记
    vdi文件扩容
  • 原文地址:https://www.cnblogs.com/cs1003/p/2692360.html
Copyright © 2011-2022 走看看