codeforces1221D - フェンスグレートアゲインを作ります

質問の意味:

T群、nは各フェンス、n個の行は、フェンスのそれぞれの以下の初期高さと高さあたりのコストを与えるには、++、+同じだけ各フェンスにはない、隣接するフェンスの高さを作るためにあなたを求めて最小コスト+。

アイデア:

初期INF

DP [I] [J] - I + jの現在位置

DP [I] [J] =分(DP [I]、[J]、DP [I - 1] [K] + B [I] * J); DPからDP [I] [J] [I - 1 ] [0-2]変換は、異なる状況でその隣接確保します。

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