求调
查看原帖
求调
670978
Arc0_FishyFool楼主2025/6/30 12:39

样例能过,但神秘爆0

#include <bits/stdc++.h>
using namespace std;
int n,m,dp[404][50][50][50],cnt[5],x,a[404];
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;++i) cin>>a[i];
	for(int i=1;i<=m;++i){
		cin>>x;
		cnt[x]++;
	}
	dp[1][0][0][0]=a[1];
	for(int i=2;i<=n;++i){
		if(cnt[1]){
			for(int cd1=1;cd1<=cnt[1];++cd1){
				for(int cd2=0;cd2<=cnt[2];++cd2){
					for(int cd3=0;cd3<=cnt[3];++cd3){
						int cd4=i-cd1-cd2*2-cd3*3-1;
						if(cd4<0||cd4>cnt[4]) continue;
						dp[i][cd1][cd2][cd3]=max(dp[i-1][cd1-1][cd2][cd3]+a[i],dp[i][cd1][cd2][cd3]);
					}
				}
			}
		}
		if(i>2&&cnt[2]){
			for(int cd1=0;cd1<=cnt[1];++cd1){
				for(int cd2=1;cd2<=cnt[2];++cd2){
					for(int cd3=0;cd3<=cnt[3];++cd3){
						int cd4=i-cd1-cd2*2-cd3*3-1;
						if(cd4<0||cd4>cnt[4]) continue;
						dp[i][cd1][cd2][cd3]=max(dp[i-2][cd1][cd2-1][cd3]+a[i],dp[i][cd1][cd2][cd3]);
					}
				}
			}
		}
		if(i>3&&cnt[3]){
			for(int cd1=0;cd1<=cnt[1];++cd1){
				for(int cd2=0;cd2<=cnt[2];++cd2){
					for(int cd3=1;cd3<=cnt[3];++cd3){
						int cd4=i-cd1-cd2*2-cd3*3-1;
						if(cd4<0||cd4>cnt[4]) continue;
						dp[i][cd1][cd2][cd3]=max(dp[i-3][cd1][cd2][cd3-1]+a[i],dp[i][cd1][cd2][cd3]);
					}
				}
			}
		}
		if(i>4&&cnt[4]){
			for(int cd1=0;cd1<=cnt[1];++cd1){
				for(int cd2=0;cd2<=cnt[2];++cd2){
					for(int cd3=0;cd3<=cnt[3];++cd3){
						int cd4=i-cd1-cd2*2-cd3*3-1;
						if(cd4<=0||cd4>cnt[4]) continue;
						dp[i][cd1][cd2][cd3]=max(dp[i-4][cd1][cd2][cd3]+a[i],dp[i][cd1][cd2][cd3]);
					}
				}
			}
		}
	}
	cout<<dp[n][cnt[1]][cnt[2]][cnt[3]];
	return 0;
}
2025/6/30 12:39
加载中...