HDU 1494(跑跑卡丁车)

#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 10005;
const int INF = 0x3f3f3f3f;

int A[MAXN], B[MAXN]; //普通耗时,加速耗时
int dp[MAXN][20]; //dp[i][j]表示经过i段赛道,剩余j个能量,所用的最短时间
int L, N; //赛道数,圈数

int main()
{
	while (cin >> L >> N)
	{
		for (int i = 1; i <= L; i++)
			cin >> A[i];
		for (int i = 1; i <= L; i++)
			cin >> B[i];
		A[0] = A[L];
		B[0] = B[L];
		for (int i = L + 1; i <= L * N; i++) //扩充赛道
		{
			A[i] = A[i % L];
			B[i] = B[i % L];
		}

		for (int i = 1; i < 15; i++)
			dp[0][i] = INF;
		dp[0][0] = 0;

		for (int i = 0; i < L * N; i++) //动态规划
		{
			for (int j = 0; j < 15; j++)
			{
				if (j == 0)
					dp[i + 1][j] = dp[i][j + 5] + B[i + 1];
				else if (j < 10)
					dp[i + 1][j] = min(dp[i][j - 1] + A[i + 1], dp[i][j + 5] + B[i + 1]);
				else if (j > 10)
					dp[i + 1][j] = dp[i][j - 1] + A[i + 1];
				else if (j == 10)
					dp[i + 1][j] = min(dp[i][j - 1] + A[i + 1], dp[i][14] + A[i + 1]);
			}
		}

		int ans = INF;
		for (int i = 0; i < 15; i++)
		{
			if (dp[L * N][i] < ans)
				ans = dp[L * N][i];
		}
		cout << ans << endl;
	}
	return 0;
}
发布了332 篇原创文章 · 获赞 1 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Intelligence1028/article/details/105702923
hdu
今日推荐