codeforces1221D - Make The Fence Great Again

题意:

t组,每次给n个篱笆,下面n行给出每个篱笆的初始高度和每次高度++的cost,问你要使相邻的篱笆高度都不一样且只能对篱笆每次++的最小cost。

思路:

初始化inf

dp[i][j]——当前到第i个 这个位置+j

dp[i][j] = min(dp[i][j],dp[i - 1][k] + b[i] * j);       dp[i][j]是从dp[i - 1][0 ~ 2]在保证相邻不相同的situation下转化来的。

AC代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>

using namespace std;
const int MaxN = 3e5 + 5;
typedef long long LL;
const LL inf = 0x3f3f3f3f3f3f3f3f;

int t,n;
LL a[MaxN],b[MaxN];
LL dp[MaxN][4];

int main()
{
	scanf("%d",&t);
	while(t--){
		scanf("%d",&n);
		for(int i = 1;i <= n; i++){
			scanf("%lld %lld",&a[i],&b[i]);
		}
		for(int i = 1;i <= n; i++){
			for(int j = 0;j < 4; j++){
				dp[i][j] = inf;
			}
		}
		for(int i = 1;i <= n; i++){
			for(int j = 0;j < 3; j++){//第i位+j
				int cur = a[i] - a[i - 1] + j;//当前与上一个原本的高度差
				for(int k = 0;k < 3; k++){//上一个已经是+k
					if(cur == k) continue;
					//我现在+j造成的结果是比原来的大k 上一个+k那就相邻相等了
					dp[i][j] = min(dp[i][j],dp[i - 1][k] + j * b[i]);
				}
			}
		}
		printf("%lld\n",min(min(dp[n][0],dp[n][1]),dp[n][2]));
	}
}
发布了31 篇原创文章 · 获赞 5 · 访问量 1378

猜你喜欢

转载自blog.csdn.net/qq_43685900/article/details/101201970