被黄题击杀了(UMKOI R1D)
查看原帖
被黄题击杀了(UMKOI R1D)
659460
SunsetVoice楼主2025/7/29 17:03

并没有看见 n2000n\le 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
*/
2025/7/29 17:03
加载中...