!HDU 1494 跑跑卡丁车-dp-

题意:一圈赛道分成L段,每段有两种情况,以普通速度则获得20%能量,用加速卡则速度加速;加速卡需要100%的能量来换取。加速卡最多收集两张。求跑完m圈的最短时间。

分析:

dp问题还是状态搞不定。跟RP那道结合起来看吧。RP是一维,这题是二维,但是确定状态的出发点是相似的。

引用一段网友的话,加深理解:“因为赛道分为L段,所以很容易想到让DP的第一维用来表示当前在第几段赛道。因为加速卡要100%能量才会获得一张,而每走一段赛道又会获得20%的能量,所以我们可以吧能量槽也分成段,具有5段能量槽就可以获得一张加速卡,那么用第二维来表示当前的能量槽的段数话,就表示出所有的状态了。”

dp[i][j]表示在i段能量为j的时候花费的最短时间,dp[i][j]=min(dp[i-1][j-2]+a[i],dp[i-1][j+10]+b[i])。注意一些特殊情况单独考虑,如j=20可以是18也可以是28转移过来的

代码:

#include<iostream>
#define INF 100000000007
using namespace std;
int l,m;
long long dp[10005][50],ans;
int a[10005],b[10005];
long long min(long long i,long long j)
{
	return i<j?i:j;
}
void DP()
{
	for(int i=1;i<=l*m;i++)
		for(int j=0;j<30;j+=2)
		    dp[i][j]=INF;
	dp[1][2]=a[1];
	for(int i=2;i<=l*m;i++){
		for(int j=0;j<30;j+=2){
			if(j>0&&j<20) dp[i][j]=min(dp[i-1][j-2]+a[i],dp[i-1][j+10]+b[i]);
			if(j==0) dp[i][j]=dp[i-1][j+10]+b[i];
			if(j>20) dp[i][j]=dp[i-1][j-2]+a[i];
			if(j==20) dp[i][j]=min(dp[i-1][j-2]+a[i],dp[i-1][28]+a[i]);
		}
	}
}
int main()
{
	while(cin>>l>>m){
		for(int i=1;i<=l;i++){
		   cin>>a[i];
		   for(int j=1;j<=m;j++)
		      a[i+l*j]=a[i];
		}
		for(int i=1;i<=l;i++){
		    cin>>b[i];
		    for(int j=1;j<=m;j++)
		       b[i+l*j]=b[i];
		}
		DP();
		ans=INF;
		for(int i=0;i<30;i+=2)
		   ans=min(ans,dp[l*m][i]);
		cout<<ans<<endl;
	}
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-15 08:51:22

!HDU 1494 跑跑卡丁车-dp-的相关文章

hdu 1494 跑跑卡丁车 dp

跑跑卡丁车 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2514    Accepted Submission(s): 875 Problem Description 跑跑卡丁车是时下一款流行的网络休闲游戏,你可以在这虚拟的世界里体验驾驶的乐趣.这款游戏的特别之处是你可以通过漂移来获得一种 加速卡,用这种加速卡可以在有限的时间里提高

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

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

Hdu 1494 跑跑卡丁车

题目链接 中文题,题意一目了然 L段路,N圈 那么可以视为L*N段路  跑一圈所用最快时间. 每个加速卡由100能量得到,每跑一段路得到20的能量,最多获得2张加速卡以及80能量. 可以简化成 1表示20能量,则5表示一张加速卡,10表示两张,14表示2张加速卡以及80能量,当为15时则成了两张加速卡以及0能量 设dp[i][j]为在第i段路,能量为j时所用最快时间,则状态转移方程则为: dp[i+1][10]  = min(dp[i][j] + a[i], dp[i+1][10]) , j+1

hdu 4734 数位dp

http://acm.hdu.edu.cn/showproblem.php?pid=4734 Problem Description For a decimal number x with n digits (AnAn-1An-2 ... A2A1), we define its weight as F(x) = An * 2n-1 + An-1 * 2n-2 + ... + A2 * 2 + A1 * 1. Now you are given two numbers A and B, plea

hdu 3853 概率DP 简单

http://acm.hdu.edu.cn/showproblem.php?pid=3853 题意:有R*C个格子,一个家伙要从(0,0)走到(R-1,C-1) 每次只有三次方向,分别是不动,向下,向右,告诉你这三个方向的概率,以及每走一步需要耗费两个能量,问你走到终点所需要耗费能量的数学期望: 回头再推次,思想跟以前的做过的类似 注意点:分母为0的处理 #include <cstdio> #include <cstring> #include <algorithm>

HDU 4968 (水dp 其他?)

1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <vector> 5 #include <map> 6 using namespace std; 7 const int inf = 0x3f3f3f3f; 8 const int MAX = 200+10; 9 double GPA[10],dp1[20][30000],dp2[20][30000

hdu 4123 树形DP+RMQ

http://acm.hdu.edu.cn/showproblem.php?pid=4123 Problem Description Bob wants to hold a race to encourage people to do sports. He has got trouble in choosing the route. There are N houses and N - 1 roads in his village. Each road connects two houses,

HDU 3853 概率dp

LOOPS Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 125536/65536 K (Java/Others) Total Submission(s): 2337    Accepted Submission(s): 951 Problem Description Akemi Homura is a Mahou Shoujo (Puella Magi/Magical Girl).Homura wants to help he

hdu 1087 简单dp

思路和2391一样的.. <span style="font-size:24px;">#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> using namespace std; const int inf=(0x7f7f7f7f); int main() { int a; int s[10005]; int w[10005];