B求助 悬10r
  • 板块学术版
  • 楼主__A___
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/10/20 18:35
  • 上次更新2024/10/20 20:05:31
查看原帖
B求助 悬10r
1423546
__A___楼主2024/10/20 18:35
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+5;
int typ,T,n,m,dp[N][N][2][2],a[3][N];
int main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0),cin>>typ>>T;
    while(T--){
        cin>>n>>m;
        for(int i=1;i<=2;i++){
            for(int j=1;j<=n;j++){
                char c;
                cin>>c,c-='0';
                if(!c){
                    a[i][j]=-1;
                }
                else{
                    a[i][j]=1;
                }
            }
        }
        for(int i=1;i<=n;i++){
            for(int j=0;j<=m;j++){
                for(int A=0;A<2;A++){
                    for(int B=0;B<2;B++){
                        dp[i][j][A][B]=-1e9;
                    }
                }
            }
        }
        //dp[i][j][A][B]为我们从第1列到第i列选一个联通块 且这个联通块对于第i列的状态是(A,B) 而且交换了j列 此时的最大收益
        for(int i=0;i<2;i++){
            dp[1][i][0][0]=0,dp[1][i][1][1]=a[1][1]+a[2][1];
            if(i){
                dp[1][i][1][0]=a[2][1],dp[1][i][0][1]=a[1][1];
            }
            else{
                dp[1][i][1][0]=a[1][1],dp[1][i][0][1]=a[2][1];
            }
        }
        for(int i=2;i<=n;i++){
            for(int j=0;j<=min(i,m);j++){
                for(int A=0;A<2;A++){
                    for(int B=0;B<2;B++){
                        if(A||B){
                            int x=1e9,y=1e9;
                            if(A&&B){
                                x=a[1][i]+a[2][i]+max(0,max(dp[i-1][j][0][1],max(dp[i-1][j][1][0],dp[i-1][j][1][1])));
                                if(j){
                                    y=a[1][i]+a[2][i]+max(0,max(dp[i-1][j-1][0][1],max(dp[i-1][j-1][1][0],dp[i-1][j-1][1][1])));
                                }
                            }
                            else{
                                int tmp;
                                if(A){
                                    tmp=a[1][i];
                                }
                                else{
                                    tmp=a[2][i];
                                }
                                x=tmp+max(0,max(dp[i-1][j][A][B],dp[i-1][j][1][1]));
                                if(!A){
                                    tmp=a[1][i];
                                }
                                else{
                                    tmp=a[2][i];
                                }
                                if(j){
                                    y=tmp+max(0,max(dp[i-1][j-1][A][B],dp[i-1][j-1][1][1]));
                                }
                            }
                            dp[i][j][A][B]=min(x,y);
                        }
                    }
                }
            }
        }
        int ans=-1e9;
        for(int i=1;i<=n;i++){
            for(int A=0;A<2;A++){
                for(int B=0;B<2;B++){
                    int tmp=1e9;
                    for(int j=0;j<=min(i,m);j++){
                        tmp=min(tmp,dp[i][j][A][B]);
                    }
                    ans=max(ans,tmp);
                }
            }
        }
        cout<<ans<<'\n';
    }
}
2024/10/20 18:35
加载中...