C. Three displays
Examples
input
5
2 4 5 4 10
40 30 20 10 40
output
90
input
3
100 101 100
2 4 5
output
-1
input
10
1 2 3 4 5 6 7 8 9 10
10 13 11 14 15 12 13 13 18 13
output
33
动态规划:
定义状态:f [ i ] [ j ] ,表示以i结尾,长度为j的串中花费的最小费用。
状态转移:
f [ i ] [2 ]=min(f [ 1…i-1 ] [1 ])+ci
f [ i ] [3 ]=min(f [ 1…i-1 ] [2 ])+ci
最后找出所有f [ i ] [3 ]的最小的一个就好了
边界:
f [ i ] [1 ]=ci,因为要取最小值,其他都得是INF.
真正意义上的,自己定义状态+转移,用dp解决,特以此纪念。
#include<algorithm>
#include<iostream>
#include<cstring>
#include<string>
#include<cmath>
#define endl '\n'
#define int long long
using namespace std;
const int N=3e3+7;
int a[N];
int c[N];
int dp[N][4];
void solve()
{
int n;
cin>>n;
memset(dp,INF,sizeof dp);
for(int i=1;i<=n;++i)
{
cin>>a[i];
}
for(int i=1;i<=n;++i)
{
cin>>c[i];
dp[i][1]=c[i];
}
int ans=INF;
for(int i=1;i<=n;++i)
{
for(int j=1;j<=i;++j)
{
if(a[j]<a[i])
{
dp[i][2]=min(dp[i][2],dp[j][1]+c[i]);
dp[i][3]=min(dp[i][3],dp[j][2]+c[i]);
}
}
ans=min(ans,dp[i][3]);
}
if(ans==INF)cout<<-1<<endl;
else cout<<ans<<endl;
}
signed main()
{
fastio();
int t;
t=1;
//cin>>t;
while(t--)
{
solve();
}
return 0;
}