记搜90
查看原帖
记搜90
837522
kangkang123456789楼主2024/10/10 15:41

https://www.luogu.com.cn/record/list?pid=P2217&user=837522

#include<iostream>
#include<limits>
#include<math.h>
#define N 11
#define rs(x0,y0,x1,y1) (sum[x1][y1]-sum[x1][y0]-sum[x0][y1]+sum[x0][y0])
#define in(x,y) (((x)>=0)&&((x)<n)&&((y)>=0)&&((y)<m))
#define sqr(a) ((a)*(a))
using namespace std;
int sum[N][N],a[N][N],s,n,m,k;
double dp[N][N][N][N][N],INF;
double dfs(int x,int y,int z,int w,int c){
#define this dp[x][y][z][w][c]
	if(c<0||!in(x,y)||!in(z-1,w-1)||x>=z||y>=w)return 0;
	if(c==0)return this=sqr(rs(x,y,z,w)-s*1.0/k);
	if(this)return this;
	this=INF;
	for(int p=0;p<c;p++){
		for(int i=x+1;i<=z;i++){
			this=min(this,dfs(x,y,i,w,p)+dfs(i,y,z,w,c-p-1));
		}
		for(int j=y+1;j<=w;j++){
			this=min(this,dfs(x,y,z,j,p)+dfs(x,j,z,w,c-p-1));
		}
	}
	return this;
#undef this
}
int main(){
	INF=numeric_limits<double>::max();
   cin>>n>>m>>k;
   for(int i=0;i<n;i++){
   	for(int j=0;j<m;j++){
   		cin>>a[i][j];
			sum[i+1][j+1]=sum[i][j+1]+sum[i+1][j]-sum[i][j]+a[i][j];
			s+=a[i][j];
		}
	}
	printf("%0.2lf",sqrt(dfs(0,0,n,m,k-1)/k));
	return 0;
}
2024/10/10 15:41
加载中...