1.最大正方形
我的瞎猜分析:
我的瞎猜算法:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <stdio.h> #include <memory.h> #include <math.h> #include <string> #include <vector> #include <set> #include <stack> #include <queue> #include <algorithm> #include <map> #define I scanf #define OL puts #define O printf #define F(a,b,c) for(a=b;a<c;a++) #define FF(a,b) for(a=0;a<b;a++) #define FG(a,b) for(a=b-1;a>=0;a--) #define LEN 101 #define MAX 1<<30 #define V vector<int> using namespace std; int dp[LEN][LEN][LEN]; int a[LEN][LEN]; int main(){ freopen("D:/CbWorkspace/动态规划/最大正方形.txt","r",stdin); int n,m,i,j,v,k; I("%d%d",&n,&m); F(i,1,n+1) F(j,1,m+1) { I("%d",&a[i][j]); if(a[i][j]) dp[i][j][1]=1; } int ans=0; for(v=1;v<n;v++){ for(i=1;i+v<=n;i++){ for(j=1;j+v<=m;j++){ dp[i][j][v+1]=dp[i][j][v]; if(dp[i][j][v]==v){ bool flag=1; for(k=j;k<=j+v;k++){ //横向侧边 if(!a[i+v][k]){ flag=0; break; } } if(flag) for(k=i;k<i+v;k++){ //纵向侧边 if(!a[k][j+v]){ flag=0; break; } } if(flag){ dp[i][j][v+1]++; } } ans=max(ans,dp[i][j][v+1]); } } } printf("%d",ans); return 0; }
我的瞎猜算法:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <stdio.h> #include <memory.h> #include <math.h> #include <string> #include <vector> #include <set> #include <stack> #include <queue> #include <algorithm> #include <map> #define I scanf #define OL puts #define O printf #define F(a,b,c) for(a=b;a<c;a++) #define FF(a,b) for(a=0;a<b;a++) #define FG(a,b) for(a=b-1;a>=0;a--) #define LEN 101 #define MAX 1<<30 #define V vector<int> using namespace std; int dp[LEN][LEN][LEN]; int a[LEN][LEN]; int main(){ freopen("D:/CbWorkspace/动态规划/最大正方形.txt","r",stdin); int n,m,i,j,v,k; I("%d%d",&n,&m); F(i,1,n+1) F(j,1,m+1) { I("%d",&a[i][j]); if(a[i][j]) dp[i][j][1]=1; } int ans=0; for(v=1;v<n;v++){ for(i=1;i+v<=n;i++){ for(j=1;j+v<=m;j++){ dp[i][j][v+1]=dp[i][j][v]; if(dp[i][j][v]==v){ bool flag=1; for(k=j;k<=j+v;k++){ //横向侧边 if(!a[i+v][k]){ flag=0; break; } } if(flag) for(k=i;k<i+v;k++){ //纵向侧边 if(!a[k][j+v]){ flag=0; break; } } if(flag){ dp[i][j][v+1]++; } } ans=max(ans,dp[i][j][v+1]); } } } printf("%d",ans); return 0; }