HDU ACM 1494 跑跑卡丁车动态规划

分析:L段,N圈,则总共可表示为L*N段,用增加20%的能量表示一个状态,则可表示20%,40%,%60。。。,共15个,注意第15个时要清零到两个能量卡;用dp[i][j]表示在第i段能量为j的已用时的最少时间。则可得到方程1、不用能量卡时dp[i][j]=min(dp[i][j],dp[i-1][j-1]+a[i-1];用能量卡时dp[i][j-5]=min(dp[i][j-5],dp[i-1][j]+b[i-1])。

#include<iostream>
using namespace std;

int Ai[102];
int Bi[102];
int dp[10010][16];
#define MAX 1000000

int main()
{
	int L,N;
	int i,j,len,res;

	while(scanf("%d %d",&L,&N)==2)
	{
		len=L*N;
		for(i=0;i<L;i++) scanf("%d",&Ai[i]);
		for(i=0;i<L;i++) scanf("%d",&Bi[i]);

		for(i=0;i<=len;i++)
			for(j=0;j<=15;j++)
				dp[i][j]=MAX;

		dp[0][0]=0;
		for(i=1;i<=len;i++)
		{
			for(j=15;j>=1;j--)
				dp[i][j]=dp[i][j]<dp[i-1][j-1]+Ai[(i-1)%L]?dp[i][j]:dp[i-1][j-1]+Ai[(i-1)%L];//不使用加速卡
			for(j=14;j>=5;j--)
				dp[i][j-5]=dp[i][j-5]<dp[i-1][j]+Bi[(i-1)%L]?dp[i][j-5]:dp[i-1][j]+Bi[(i-1)%L];//使用加速卡
			dp[i][10]=dp[i][10]<dp[i][15]?dp[i][10]:dp[i][15];    //15时能量减为2个加速卡的能量.
		}
		for(res=MAX,i=0;i<=15;i++)
			res=res<dp[len][i]?res:dp[len][i];
		printf("%d\n",res);
	}
    return 0;
}
时间: 2024-08-15 22:38:29

HDU ACM 1494 跑跑卡丁车动态规划的相关文章

HDU ACM 2059 龟兔赛跑-&gt;动态规划

分析:动态规划,一定要注意当前状态需要和前面所有的状态一起进行考虑,另外注意浮点数的处理,还WA了一次. #include<iostream> using namespace std; int L,N,C,T,VR,VT1,VT2; int a[105]; double dp[105]; double min_time_ij(int i_0,int j_0) { if(j_0-i_0>C) return C*1.0f/VT1+(j_0-i_0-C)*1.0f/VT2; else retu

hdu 1494 跑跑卡丁车(动态规划)

Problem Description 跑跑卡丁车是时下一款流行的网络休闲游戏,你可以在这虚拟的世界里体验驾驶的乐趣.这款游戏的特别之处是你可以通过漂移来获得一种加速卡,用这种加速卡可以在有限的时间里提高你的速度.为了使问题简单化,我们假设一个赛道分为L段,并且给你通过每段赛道的普通耗时Ai和用加速卡的耗时Bi.加速卡的获得机制是:普通行驶的情况下,每通过1段赛道,可以获得20%的能量(N2O).能量集满后获得一个加速卡(同时能量清0).加速卡最多可以储存2个,也就是说当你有2个加速卡而能量再次

[ACM] hdu 1260 Tickets (动态规划)

Tickets Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submission(s) : 4   Accepted Submission(s) : 2 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description Jesus, what a great movie! Thou

HDU ACM 1103 Flo&#39;s Restaurant

分析:借助STL的min_element实现.每次更新最先被占用的桌子,具体见注释. #include<iostream> #include<algorithm> using namespace std; int main() { int A,B,C; char s[10]; int a[102],b[102],c[102]; int curtime,count,ans; int *p; //桌子最先空闲时间 while(cin>>A>>B>>C

hdu acm 1425 sort(哈希表思想)

sort Time Limit: 6000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 25803    Accepted Submission(s): 7764 Problem Description 给你n个整数,请按从大到小的顺序输出其中前m大的数. Input 每组测试数据有两行,第一行有两个数n,m(0<n,m<1000000),第二行包含n个各不相同,且

HDU ACM 1005 Number Sequence

Number Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 119732    Accepted Submission(s): 29072 Problem Description A number sequence is defined as follows:f(1) = 1, f(2) = 1, f(n) = (A

hdu acm 1166 敌兵布阵 (线段树)

敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 37903    Accepted Submission(s): 15985 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务

HDU ACM 1025 Constructing Roads In JGShining&amp;#39;s Kingdom-&amp;gt;二分求解LIS+O(NlogN)

#include<iostream> using namespace std; //BFS+优先队列(打印路径) #define N 500005 int c[N]; int dp[N]; //dp[i]保存的是长度为i的最长不降子序列的最小尾元素 int BS(int n,int x) //二分查找下标,当x比全部元素小时下标为1,比全部元素大时下标为n+1. { int low,high,mid; low=1,high=n; while(low<=high) { mid=(low+h

杭电 HDU ACM 圆桌会议

圆桌会议 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3356    Accepted Submission(s): 2351 Problem Description HDU ACM集训队的队员在暑假集训时经常要讨论自己在做题中遇到的问题.每当面临自己解决不了的问题时,他们就会围坐在一张圆形的桌子旁进行交流,经过大家的讨论后一般没有