【CodeForces - 987C 】Three displays (dp,最长上升子序列类问题,三元组问题)
題干:
It is the middle of 2018 and Maria Stepanovna, who lives outside Krasnokamensk (a town in Zabaikalsky region), wants to rent three displays to highlight an important problem.
There are?nn?displays placed along a road, and the?ii-th of them can display a text with font size?sisi?only. Maria Stepanovna wants to rent such three displays with indices?i<j<ki<j<k?that the font size increases if you move along the road in a particular direction. Namely, the condition?si<sj<sksi<sj<sk?should be held.
The rent cost is for the?ii-th display is?cici. Please determine the smallest cost Maria Stepanovna should pay.
Input
The first line contains a single integer?nn?(3≤n≤30003≤n≤3000)?— the number of displays.
The second line contains?nn?integers?s1,s2,…,sns1,s2,…,sn?(1≤si≤1091≤si≤109)?— the font sizes on the displays in the order they stand along the road.
The third line contains?nn?integers?c1,c2,…,cnc1,c2,…,cn?(1≤ci≤1081≤ci≤108)?— the rent costs for each display.
Output
If there are no three displays that satisfy the criteria, print?-1. Otherwise print a single integer?— the minimum total rent cost of three displays with indices?i<j<ki<j<k?such that?si<sj<sksi<sj<sk.
Examples
Input
5 2 4 5 4 10 40 30 20 10 40Output
90Input
3 100 101 100 2 4 5Output
-1Input
10 1 2 3 4 5 6 7 8 9 10 10 13 11 14 15 12 13 13 18 13Output
33Note
In the first example you can, for example, choose displays?11,?44?and?55, because?s1<s4<s5s1<s4<s5?(2<4<102<4<10), and the rent cost is?40+10+40=9040+10+40=90.
In the second example you can't select a valid triple of indices, so the answer is?-1.
題目大意:
解題報告:
? ?三元組問題。
? ?類似最長上升子序列的做法,但是維護的不是長度,而是的最小值。
AC代碼:
#include<bits/stdc++.h> #define ll long long using namespace std; const int MAX = 3000 + 5; const ll INF = 0x3f3f3f3f3f3f3f3f; ll a[MAX]; ll b[MAX]; ll dp[MAX]; int main() {int n;ll ans = INF;cin>>n;for(int i = 1; i<=n; i++) {scanf("%lld",&a[i]);}for(int i = 1; i<=n; i++) {scanf("%lld",&b[i]);}memset(dp,INF, sizeof(dp));for(int i =2; i<=n-1; i++) {//其實不用到n,因為還要留一個給第三個display,所以這里遞歸到n-1.for(int j = 1; j<i; j++) {if(a[i] > a[j])dp[i] = min(dp[i], b[i] + b[j]);}} // printf("%lld\n",dp[3]);for(int i = 1; i<=n-1; i++) {for(int j = i+1; j<=n; j++) {if(a[j] > a[i])ans = min(ans ,dp[i]+b[j]); // printf("%lld %lld ==== %d %d\n",dp[i],b[j] ,i,j);}}if(ans == INF) printf("-1\n");else cout << ans<<endl;return 0 ; }或者直接dp解:
詳見博客https://blog.csdn.net/xs18952904/article/details/80504296
?
20191003
忽然發(fā)現(xiàn)今天隨便刷codeforce的C題又刷到這道題了,特此更新:
#include<cstdio> #include<iostream> #include<algorithm> #include<queue> #include<stack> #include<map> #include<vector> #include<set> #include<string> #include<cmath> #include<cstring> #define FF first #define SS second #define ll long long #define pb push_back #define pm make_pair using namespace std; typedef pair<int,int> PII; const int MAX = 2e5 + 5; ll dp1[MAX],dp2[MAX],a[MAX],c[MAX]; int n; int main() {cin>>n;for(int i = 1; i<=n; i++) scanf("%lld",a+i),dp1[i]=1e18;for(int i = 1; i<=n; i++) scanf("%lld",c+i),dp2[i]=1e18;for(int i = 1; i<=n; i++) {for(int j = 1; j<i; j++) {if(a[i] > a[j]) dp1[i] = min(dp1[i],c[j]+c[i]);}}for(int i = 1; i<=n; i++) {for(int j = 1; j<i; j++) {if(a[i] > a[j]) dp2[i] = min(dp2[i],dp1[j]+c[i]);}}ll ans = *min_element(dp2+1,dp2+n+1);if(ans == (ll)1e18) ans = -1;printf("%lld\n",ans);return 0 ; }?
總結
以上是生活随笔為你收集整理的【CodeForces - 987C 】Three displays (dp,最长上升子序列类问题,三元组问题)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 美科技巨头每秒能赚多少钱?苹果11376
- 下一篇: 【CodeForces - 340D】B