atcoder abc 438D
原题
(https://atcoder.jp/contests/abc438/tasks/abc438_d)
题目意思简单来说就是
给你三个数组
A 1 4 2 4 3
B 2 3 4 2 2
C 3 2 4 4 3
要求的是ABC中三个数组分别是蛇的头部,身体,尾巴
三个数组中每个数组都至少要被取走一次,不可以五个点全取A,或者有一个没被取过,因为不可以简单的就是取最大,要整体考虑,所以我们考虑dp
完整代码
void solve(){
int n;cin>>n;
vector<int>a(n+1),b(n+1),c(n+1);
//dp[i][j]表示的是处理到了第i个位置,j表示状态
/*
0 还没开始选
1在选a中的元素
2在选b中的元素
3在选c中的元素
*/
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<=n;i++)cin>>c[i];
vector<vector<int>>dp(n+1,vector<int>(4,-INF));
dp[0][0]=0;
for(int i=1;i<=n;i++){
dp[i][1]=max(dp[i-1][0]+a[i],dp[i-1][1]+a[i]);
dp[i][2]=max(dp[i-1][1]+b[i],dp[i-1][2]+b[i]);
dp[i][3]=max(dp[i-1][2]+c[i],dp[i-1][3]+c[i]);
}
cout<<dp[n][3]<<endl;
}

浙公网安备 33010602011771号