【CodeForces 987C】Three displays
阿新 • • 發佈:2018-10-03
txt esp turn 最小花費 最小 cpp display spa com
【鏈接】 我是鏈接,點我呀:)
【題意】
【題解】
動態規劃
設dp[i][j]表示前i個數字,選了j個的最小花費。
dp[i][j] = min(dp[k][j-1]+b[i]);//其中a[i]>a[k]且k<i
這其實就是枚舉選取的第j-1個位置在哪個地方.
顯然只有在它的前面,且滿足a[i]>a[k]的位置k才有可能。
復雜度O(N^2)
【代碼】
#include <bits/stdc++.h> using namespace std; const int N = 3e3; const int INF = 4e8; int n; int a[N+10],b[N+10]; int dp[N+10][4]; int main() { #ifdef LOCAL_DEFINE freopen("rush.txt","r",stdin); #endif // LOCAL_DEFINE ios::sync_with_stdio(0),cin.tie(0); cin >> n; for (int i = 1;i <= n;i++) cin >> a[i]; for (int i = 1;i <= n;i++) cin >> b[i]; for (int i = 1;i <= 3;i++) for (int j = 1;j <= n;j++) dp[j][i] = INF; for (int i = 1;i <= n;i++) dp[i][1] = b[i]; for (int j = 2;j <= 3;j++) for (int i = j;i <= n;i++) for (int k = j-1;k <= i-1;k++) if (a[i]>a[k] && dp[i][j]>dp[k][j-1]+b[i]){ dp[i][j] = dp[k][j-1]+b[i]; } int ans = INF; for (int i = 3;i <= n;i++) ans = min(ans,dp[i][3]); if (ans==INF) cout<<-1<<endl; else cout<<ans<<endl; return 0; }
【CodeForces 987C】Three displays