codeforces 987c dp
阿新 • • 發佈:2019-01-27
比賽時只想到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; }