1 条题解

  • 0
    @ 2025-2-14 21:20:42

    C :

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define MAXR 110
    #define MAXC 15
    #define MAXM 70
    #define max(A,B) ((A)<(B)?(B):(A))
    #define CL(A) memset(A,0,sizeof(A))
    #define legal(A,B) ((A)&(B))
    
    int row, col;
    int nums;
    int base[MAXR];
    int state[MAXM];
    int soldier[MAXM];
    int dp[MAXR][MAXM][MAXM];
    
    char g[MAXR][MAXC];
    
    int main() {
    CL(base), CL(state), CL(soldier), CL(dp);
    nums = 0;
    scanf("%d%d",&row,&col);
    for(int i = 0;i < row; i++) {
        scanf("%s",g[i]);
        for(int j = 0;j < col; j++)
            if(g[i][j]=='H')base[i] += 1<<j;
    }
    for(int i = 0;i <(1<<col); i++) {
        if(legal(i,i<<1) || legal(i,i<<2))continue;
        int k = i;
        while(k) {
            soldier[nums] += k&1;
            k = k >> 1;
        }
        state[nums++] = i;
    }
    for(int i = 0;i < nums; i++) {
        if(legal(state[i],base[0]))continue;
        dp[0][i][0]=soldier[i];
    }
    for(int i = 0;i < nums; i++) {
        if(legal(state[i],base[1]))continue;
        for(int j = 0;j < nums; j++) {
            if(legal(state[j],base[0]))continue;
            if(legal(state[i],state[j]))continue;
            dp[1][i][j]=max(dp[1][i][j],dp[0][j][0]+soldier[i]);
        }
    }
    for(int r = 2;r <= row; r++) {
        for(int i = 0;i < nums; i++) {
            if(legal(state[i],base[r]))continue;
            for(int j = 0;j < nums; j++) {
                if(legal(state[j],base[r-1]))continue;
                if(legal(state[i],state[j]))continue;
                for(int k = 0;k < nums; k++) {
                  if(legal(state[k],base[r-2]))continue;
                  if(legal(state[j],state[k]))continue;
                  if(legal(state[i],state[k]))continue;
                  dp[r][i][j]=max(dp[r][i][j],dp[r-1][j][k]+soldier[i]);
                }
    
            }
        }
    }
        int ans = 0;
        for(int i = 0;i < nums; i++) {
            for(int j = 0;j < nums; j++) {
                ans = max(ans,dp[row-1][i][j]);
            }
        }
    printf("%d\n",ans);
    return 0;
    }
    

    C++ :

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #define MAXN 101
    #define MAXK 61
    #define MAXM 11
    using namespace std;
    int f[MAXN][MAXK][MAXK];//存结果
    int g[MAXN][MAXK];//存方案
    int w[MAXN][MAXK];//存当前行的炮兵个数
    //string fa[MAXN][MAXK];
    string s;
    int n,m,tot;
    void dfs(int,int,string,int);
    void DP();
    int zh(string x){
    	int ans=0,t=1;
    	for(int i=m-1;i>=0;i--){
    		ans+=(x[i]-48)*t;
    		t<<=1;
    	}
    	return ans;
    } 
    int main(){
    	//freopen("cannon.in","r",stdin);
    	//freopen("cannon.out","w",stdout);
    	scanf("%d%d",&n,&m);
    	for(int i=1;i<=n;i++){cin>>s;dfs(i,1,"",0);}
    	if(n==1){//考虑只有一行的情况 
    		for(int i=1;i<=g[1][0];i++){
    			if(w[1][i]>tot) tot=w[1][i];
    		}
    		printf("%d\n",tot);
    		return 0;
    	}
    	for(int i=1;i<=g[1][0];i++){
    		for(int j=1;j<=g[2][0];j++){
    			int k1=g[1][i],k2=g[2][j];
    			int tem=k1&k2;
    			if(tem!=0) continue;
    			f[2][i][j]=w[1][i]+w[2][j];
    			if(f[2][i][j]>tot) tot=f[2][i][j];
    		}
    	}
    	DP();
    	printf("%d\n",tot);
    	return 0;
    }
    void DP(){
    	for(int i=3;i<=n;i++){
    		for(int k1=1;k1<=g[i-2][0];k1++){
    			for(int k2=1;k2<=g[i-1][0];k2++){
    			    int tem1=g[i-2][k1],tem2=g[i-1][k2];
    				int tem=tem1&tem2;
    				if(tem!=0)continue;
    				tem=tem1|tem2;
    				//cout<<fa[i-2][k1]<<' '<<fa[i-1][k2]<<endl;
    				for(int k3=1;k3<=g[i][0];k3++){
    					int tem3=g[i][k3];
    				    int flag=tem3&tem;
    				    if(flag!=0)continue;
    				    if(f[i][k2][k3]<f[i-1][k1][k2]+w[i][k3])f[i][k2][k3]=f[i-1][k1][k2]+w[i][k3];
    				}	
    			}
    		}
    	}
    	for(int i=1;i<=g[n-1][0];i++){
    		for(int j=1;j<=g[n][0];j++){
    			if(f[n][i][j]>tot) tot=f[n][i][j];
    		}
    	}
    	return;
    }
    void dfs(int i,int j,string k,int t){
    	if(j>m){
    		g[i][0]++;
    		int tem=g[i][0];
    		//fa[i][tem]=k;
    		g[i][tem]=zh(k);
    		w[i][tem]=t;
    		return;
    	}
    	if(s[j-1]=='P'){
    		string tem=k+"100";
    		if(tem.size()>m) tem=tem.substr(0,m);
    		dfs(i,j+3,tem,t+1);
    	}
    	string tem=k+"0";
    	if(tem.size()>m) tem=tem.substr(0,m);
    	dfs(i,j+1,tem,t);
    }
    
    • 1

    信息

    ID
    843
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者