codeforces 987c dp

比赛时只想到n^3的暴力,dp还有待提高

dp[i,j] 代表 将第i个数作为三个数中的第j个数,那么显然转移方程为 dp[i,j] = min(dp[k][j - 1] + c[i]) ,其中k < i 且 s[k] < s[i] .


贪心、二分、三分、分治、dp,算法界这五大思想现在就差dp了

#include <bits/stdc++.h>
using namespace std;

const int inf = 0x3f3f3f3f;
int main(){
	int n;
	int s[3030];
	int c[3030];
	int dp[3030][4];
	
	cin >> n;
	for(int i = 1; i <= n; i ++)
		cin >> s[i];
	for(int i = 1; i <= n; i ++)
		cin >> c[i];
	memset(dp, 0x3f, sizeof(dp));
	
	for(int i = 1; i <= n; i ++){
		dp[i][1] = c[i];
		for(int k = 2; k <= 3; k ++){
			for(int j = 1; j < i; j ++){
				if(s[j] < s[i])
					dp[i][k] = min(dp[i][k], dp[j][k - 1] + c[i]);
			}
		}
	}
	int ans = inf;
	for(int i = 1; i <= n; i ++){
		ans = min(dp[i][3], ans);
	}
	if(ans == inf)
		cout << "-1" << endl;
	else
		cout << ans << endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_38759433/article/details/80587303