• HDU-1494-跑跑卡丁车


    题目链接

    http://acm.hdu.edu.cn/showproblem.php?pid=1494

    状态方程推不出,这题,个人认为比较难,的经常看看

    将氮气看成14个状态,14为2个卡与80% 
    dp[i][j]表示为跑完第i段还剩j的最短时间,
    if(k==0)               剩0是为冲过来的。
           dp[j][k]=dp[j-1][k+5]+b[j];
    else if(k==10)      剩10有两种情况,从9过来 从14过来
           dp[j][k]=min(dp[j-1][14]+a[j],dp[j-1][9]+a[j]);
    else if(k>10&&k<=14)   这时只能普通跑过来
           dp[j][k]=dp[j-1][k-1]+a[j];
    else                                   两种选择
           dp[j][k]=min(dp[j-1][k-1]+a[j],dp[j-1][k+5]+b[j]);
     
     
    代码

    #include<stdio.h>
    #include<string.h>
    #include<iostream>
    #include<algorithm>
    #define inf 0x3f3f3f3f
    using namespace std;

    int a[110];
    int b[110];
    int dp[110][20];

    int main(void)
    {
    int i,j,k,l,n;
    while(scanf("%d%d",&l,&n)==2)
    {
    for(i=1;i<=l;i++)
    scanf("%d",a+i);
    for(i=1;i<=l;i++)
    scanf("%d",b+i);
    memset(dp[0],inf,sizeof(dp[0]));
    dp[0][0]=0;
    for(i=1;i<=n;i++)
    {
    for(j=1;j<=l;j++)
    {
    for(k=0;k<15;k++)
    {
    if(k==0)
    dp[j][k]=dp[j-1][k+5]+b[j];
    else if(k==10)
    dp[j][k]=min(dp[j-1][9]+a[j],dp[j-1][14]+a[j]);
    else if(k>10&&k<=14)
    dp[j][k]=dp[j-1][k-1]+a[j];
    else
    dp[j][k]=min(dp[j-1][k-1]+a[j],dp[j-1][k+5]+b[j]);
    }
    }
    for(j=0;j<15;j++)
    dp[0][j]=dp[l][j];
    }
    int ans=inf;
    for(i=0;i<15;i++)
    ans=min(ans,dp[l][i]);
    printf("%d ",ans);
    }
    return 0;
    }

  • 相关阅读:
    Node.js入门
    Promise入门
    MongoDB基础
    Express入门
    常用特殊符号HTML代码 (转)
    sqlserver函数简单介绍
    git忽略本地提交命令
    Scrapy入门到放弃05:让Item在Pipeline中飞一会儿
    Scrapy入门到放弃06:Spider中间件
    2022虎年微信红包封面的设计和领取
  • 原文地址:https://www.cnblogs.com/liudehao/p/4143501.html
Copyright © 2020-2023  润新知