Educational Codeforces Round 73 (Rated for Div. 2) D. Make The Fence Great Again(DP)

题目链接
在这里插入图片描述
在这里插入图片描述
题意:给定n个数,如果把一个数加1会花费bi的钱,求将所有相邻的数都不相等的花费最小是多少?
思路:dp【i】【j】表示将a【i】加j满足条件的最小花费。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=3e5+1;
ll dp[maxn][3],a[maxn],b[maxn];
int main()
{
	int n,T;
	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=0;i<=n;++i)
		for(int j=0;j<3;++j)
		dp[i][j]=1e18+1; 
		dp[0][0]=dp[0][1]=dp[0][2]=0;
		for(int i=1;i<=n;++i)
		for(int j=0;j<3;++j)
		{
			for(int k=0;k<3;++k)
			if(a[i-1]+j!=a[i]+k)
			dp[i][k]=min(dp[i][k],dp[i-1][j]+k*b[i]);
		}
		printf("%lld\n",min(dp[n][0],min(dp[n][1],dp[n][2])));
	}
 } 
发布了283 篇原创文章 · 获赞 0 · 访问量 7292

猜你喜欢

转载自blog.csdn.net/qq_42479630/article/details/105127236