1 solutions

  • 0
    @ 2024-12-11 0:49:29

    C++ :

    #include<iostream>
    #include<cstdio>
    using namespace std;
    
    const int MAXN=201;
    
    int a[MAXN][MAXN];
    int by[MAXN][MAXN],bn[MAXN][MAXN];
    int sy[MAXN][MAXN],sn[MAXN][MAXN];
    char c[MAXN][MAXN];
    /*sn[j][i]:第j列打i发子弹,最后一个子弹打第j列的砖块。
      sy[j][i]:第j列打i发子弹,最后一个子弹不打第j列的砖块。
      bn[j][i]:前j列打i发子弹,最后一个子弹打第j列的砖块  。
      by[j][i]:前j列打i发子弹,最后一个子弹不打第j列的砖块.*/
      
    int main()
    {
    	//freopen("game.in","r",stdin);
    	//freopen("gamea.out","w",stdout);
    	
    	int N,M,K;
    	scanf("%d%d%d",&N,&M,&K);
    	
    	for(int i=1;i<=N;i++)
        {
            for(int j=1;j<=M;j++)
            {
                scanf("%d %c",&a[i][j],&c[i][j]);
            }
        }
        
        for (int i=1;i<=M;++i)//循环处理第几列 
        {
            int t=N;//t为行数 
            while (t>0 && c[t][i]=='Y')
    		//如果第一个砖块是Y,那么相当于不用耗费子弹即可向上打 
            {
                sy[i][0]+=a[t][i];
                t--;//打掉这一层的砖块即可向上打 
            }
            
            //把刚开始Y砖块打完后,则下面没有砖块,从最后为Y的砖块的上一层开始 
            for (int j=1;j<=N && t>0;++j)
            {
                sn[i][j]=sy[i][j-1]+a[t][i];//第i列 
                sy[i][j]=sn[i][j];
                t--;
                
                while (t>0 && c[t][i]=='Y')
                //如果砖块是Y,那么相当于不用耗费子弹即可向上打
    			{
                    sy[i][j]+=a[t][i];
                    t--;
                    //打掉这一层的砖块即可向上打
                }
            }
        }
        
        /*for(int i=1;i<=M;++i)
        {
        	for(int k=0;k<=K;++k)
        	{
        		printf("%3d",sy[i][k]);
        	}
        	printf("\n");
        }
        printf("sy————————\n");
        
        for(int i=1;i<=M;++i)
        {
        	for(int k=0;k<=K;++k)
        	{
        		printf("%3d",sn[i][k]);
        	}
        	printf("\n");
        }
        printf("sn————————\n");*/
        
        /*for(int i=1;i<=M;++i)
        {
        	for(int k=1;k<=K;++k)
        	{
        		s[i][k]=s[i][k-1]+a[N-k+1][i];
    		}
    	}*/
    	
        for(int j=1;j<=M;++j)
        {
        	for(int i=0;i<=K;++i)
        	{
        		for(int k=0;k<=N;++k)
    			{
    				if (k<=i)
                    {
                        int tmp=by[j-1][i-k]+sy[j][k];
                        if (tmp>by[j][i]) by[j][i]=tmp;
                        
                        if (k<i)
                        {
                            tmp=bn[j-1][i-k]+sy[j][k];
                            if (tmp>bn[j][i]) bn[j][i]=tmp;
                        }
                        
                        if (k>0)
                        {
                            tmp=by[j-1][i-k]+sn[j][k];
                            if (tmp>bn[j][i]) bn[j][i]=tmp;
                        }
                    }
    			} 
    		}
    	}
    	
    	/*for(int i=1;i<=M;++i)
        {
        	for(int k=0;k<=K;++k)
        	{
        		printf("%3d",by[i][k]);
        	}
        	printf("\n");
        }
        printf("by————————\n");
        
        for(int i=1;i<=M;++i)
        {
        	for(int k=0;k<=K;++k)
        	{
        		printf("%3d",bn[i][k]);
        	}
        	printf("\n");
        }
        printf("bn————————\n");*/
        
    	printf("%d",bn[M][K]);
    
    	return 0;
    }
    
    • 1

    Information

    ID
    727
    Time
    1000ms
    Memory
    128MiB
    Difficulty
    (None)
    Tags
    # Submissions
    0
    Accepted
    0
    Uploaded By