hdu 1494 跑跑卡丁车

hdu 1494

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1494
题目大意:中文的不用讲了吧。

分析:
这个题最主要的是注意卡丁车行驶过程中能量状态的变化,分析卡丁车的加速的规律 将加速与能量相结合,变成能量状态,最后分析此状态是如何得来,进行计算。 状态转移方程:加速f[i][j]=min(f[i][j],f[i-1][j+5]+b[i]) 正常:f[i][j]=min(f[i][j],f[i-1][j-1]+a[i]).可以用线段图表示能量状态。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define inf 0x3f3f3f3f

int l,n;
int f[10005][15];//f[i][j]表示行驶完第i段该段能量状态为j的最小时间。
int a[10005],b[10005];

int minn(int a,int b)
{
    return a<b?a:b;
}

void dp()
{
    memset(f,inf,sizeof(f));
    f[0][0]=0;
    for(int i=1;i<=n*l;i++)
    {
        for(int j=0;j<15;j++)//看做背包容量,正常跑,加速跑为物品,正常跑+1,加速-5;
        {
            if(j==0)
                f[i][j]=f[i-1][j+5]+b[i];
            else
            {
                f[i][j]=f[i-1][j-1]+a[i];//正常行驶
                if(j==10)//当能量状态=14时,下一段的能量状态退回到j=10。
                    f[i][j]=minn(f[i][j],f[i-1][14]+a[i]);
                if(j<10)
                    f[i][j]=minn(f[i-1][j+5]+b[i],f[i][j]);
            }
        }
    }
}

int main()
{
    int m;
    while(~scanf("%d%d",&l,&n))
    {
        m=inf;
        for(int i=1;i<=l;i++)
            scanf("%d",&a[i]);
        for(int i=1;i<=l;i++)
            scanf("%d",&b[i]);
        for(int i=l+1;i<=n*l;i++)
        {
            a[i]=a[i-l];
            b[i]=b[i-l];
        }
        dp();
        for(int i=0;i<15;i++)
            if(f[l*n][i]<m)
            m=f[l*n][i];
        printf("%d
",m);
    }
    return 0;
}

  

 
原文地址:https://www.cnblogs.com/yang-/p/4732680.html