【普及组BOSS】

立体图

题都没读懂先咕咕咕吧

#include<bits/stdc++.h>
using namespace std;
int m,n,l,p,a[1001][1001],ma[1001],maxx,maxy,z[6]={2,1,0,0,0,0},s[6]={6,6,6,6,5,4};
char c[1001][1001],c1[10][10]={
"  +---+",
" /   /|",
"+---+ |",
"|   | +",
"|   |/",
"+---+",
};
inline void fg(int x,int y){
    for(int i=5;i>=0;i--)
        for(int j=z[i];j<=s[i];j++)
        {
            c[5-i+x][j+y]=c1[i][j];
            if(5-i+x>maxx) maxx=5-i+x;
            if(j+y>maxy) maxy=j+y;
        }
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        for(int j=0;j<m;j++){
            scanf("%d",&a[i][j]);
        }
    }   
    for(int o=1;o<=n;o++){
        for(int k=0;k<m;k++){
            for(int l=0;l<a[o][k];l++){
                fg((n-o)*2+1+3*l,(n-o)*2+1+4*k);
            }
        }
    }          
    for(int i=maxx;i>=1;i--){    
        for(int j=1;j<=maxy;j++){
            if(c[i][j]=='\000') printf(".");
            else printf("%c",c[i][j]);
        }
        printf("\n");
    }
    return 0;
}
View Code

 子矩阵

暴力枚举dfs+dp优化(待复盘)

#include<bits/stdc++.h>
#define For(i,l,r) for(int i=l;i<=r;i++)
using namespace std;
int n,m,r,c,num[20][20],ch[20],o=1,lc[20],hc[20][20],f[20][20],minn=2e9,cmin;
inline void mems(){
    For(i,1,m){
        lc[i]=0;
        for(int j=1;j<r;j++){
            lc[i]+=abs(num[ch[j]][i]-num[ch[j+1]][i]);
        }
    }
    For(i,2,m){
        for(int j=1;j<i;j++){
            hc[i][j]=0;
            For(k,1,r){
                hc[i][j]+=abs(num[ch[k]][i]-num[ch[k]][j]);
            }
        }
    }
    
}
inline void dp(){
    For(i,1,m){
        cmin=min(i,c);
        For(j,1,cmin){
            if(j==1){
                f[i][j]=lc[i];
            }
            else if(i==j){
                f[i][j]=f[i-1][j-1]+lc[i]+hc[i][j-1];
            }
            else{
                f[i][j]=2e8;
                for(int k=j-1;k<i;k++){
                    f[i][j]=min(f[i][j],f[k][j-1]+lc[i]+hc[i][k]);
                }
            }
            if(j==c) minn=min(minn,f[i][c]);
        }
    }
}
inline void dfs(int node){
    if(node>n){
        mems();
        dp();
        return;
    }
    if(r-o+1==n-node+1){
        ch[o++]=node;
        dfs(node+1);
        ch[o--]=0;
        return;
    }
    dfs(node+1);
    if(o<=r){
        ch[o++]=node;
        dfs(node+1);
        ch[o--]=0;
    }
}
int main(){
    scanf("%d%d%d%d",&n,&m,&r,&c);
    For(i,1,n){
        For(j,1,m){
            scanf("%d",&num[i][j]);
        }
    }
    dfs(1);
    printf("%d",minn);
    return 0;
} 
View Code

 

posted @ 2019-09-25 21:25  jian_song  阅读(156)  评论(0)    收藏  举报