【普及组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; }
子矩阵
暴力枚举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; }

浙公网安备 33010602011771号