1. 程式人生 > >codeforces 987c dp

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;
}