并没有看见 n≤2000,请问是写挂了还是做法假了
#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
int n;
char a[500001],b[500001];
int dp[500001][4] = {0};
int p[5] = {0};
signed main(){
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 = n+1;i<=n+20;i++){
a[i] = '0';
}
for(int i = n+1;i<=n+20;i++){
b[i] = '0';
}
for(int i = 1;i<=4;i++)cin>>p[i];
for(int i = 5;i<=n+9;i++){
if(a[i-4]=='1' and b[i-4]=='1'){
dp[i][0] = dp[i-1][0]+p[1];
dp[i][1] = dp[i-1][1]+p[1];
dp[i][0] = min(dp[i][0],dp[i-3][0]+p[2]);
dp[i][1] = min(dp[i][1],dp[i-3][1]+p[2]);
dp[i][0] = min(dp[i][0],dp[i-5][0]+p[3]);
dp[i][1] = min(dp[i][1],dp[i-5][1]+p[3]);
dp[i][2] = min(dp[i][0]+dp[i][1],dp[i-4][2]+p[4]);
}else if(a[i-4]=='1' and b[i-4]=='0'){
dp[i][0] = dp[i-1][0]+p[1];
dp[i][1] = dp[i-1][1];
dp[i][0] = min(dp[i][0],dp[i-3][0]+p[2]);
dp[i][0] = min(dp[i][0],dp[i-5][0]+p[3]);
dp[i][2] = min(dp[i][0]+dp[i][1],dp[i-4][2]+p[4]);
}else if(a[i-4]=='0' and b[i-4]=='1'){
dp[i][0] = dp[i-1][0];
dp[i][1] = dp[i-1][1]+p[1];
dp[i][1] = min(dp[i][1],dp[i-3][1]+p[2]);
dp[i][1] = min(dp[i][1],dp[i-5][1]+p[3]);
dp[i][2] = min(dp[i][0]+dp[i][1],dp[i-4][2]+p[4]);
}else{
dp[i][0] = dp[i-1][0];
dp[i][1] = dp[i-1][1];
dp[i][2] = min(dp[i][0]+dp[i][1],dp[i-1][2]);
}
cout<<i<<" "<<dp[i][0]<<" "<<dp[i][1]<<" "<<dp[i][2]<<endl;
}
int ans = 2e18;
// for(int i = 5;i<=n+9;i++){
// cout<<dp[i][2]<<" ";
// }
// cout<<endl;
for(int i = n+4;i<=n+9;i++){
ans = min(ans,dp[i][2]);
}
cout<<ans<<endl;
return 0;
}
/*
17
01000011100111101
11000111010011100
10000 10000 10000 1
9
011011101
110001110
3 5 7 10
*/