Poj 1191 바둑판 분할
제 시 된 바둑판 과 n 을 프로 그래 밍 하여 O 의 최소 값 을 구하 십시오.
사고방식: lrj 에서 P116 의 예제.dp [k] [x1] [y1] [x2] [y2]: 왼쪽 상단 좌 표 는 (x1, y1) 이 고 오른쪽 아래 좌 표 는 (x2, y2) 의 바둑판 으로 k 회 절단 후 얻 은 k + 1 개의 사각형 의 총 점 제곱 과 최소 치 를 설정 합 니 다.s [x1] [y1] [x2] [y2]: 왼쪽 상단 좌 표 는 (x1, y1) 이 고 오른쪽 아래 좌 표 는 (x2, y2) 이다.의 바둑판 의 총화 제곱 상태 전이 방정식 dp [k] [x1] [y1] [x2] [y2] = 1) 가로로 나 누 기: min(dp[k-1][x1][y1][f][y2]+s[f+1][y1][x2][y2] , dp[k-1][f+1][y1][x2][y2]+s[x1][y1][f][y2]); 2) 세로 로 나 누 기: min(dp[k-1][x1][y1][x2][f]+s[x1][f+1][x2][y2], dp[k-1][x1][f+1][x2][y2]+s[x1][y1][x2][f]);
/*
dp[k][x1][y1][x2][y2]: (x1,y1), (x2,y2)
, k k+1 .
s[x1][y1][x2][y2]: (x1,y1), (x2,y2)
dp[k][x1][y1][x2][y2] =
1) : min(dp[k-1][x1][y1][f][y2]+s[f+1][y1][x2][y2]
, dp[k-1][f+1][y1][x2][y2]+s[x1][y1][f][y2]);
2) : min(dp[k-1][x1][y1][x2][f]+s[x1][f+1][x2][y2]
, dp[k-1][x1][f+1][x2][y2]+s[x1][y1][x2][f]);
*/
#include <stdio.h>
#include <memory.h>
#include <math.h>
int n;
int dp[16][10][10][10][10];
int data[10][10];
int s[10][10][10][10];
void get_sum(int x1,int y1,int x2,int y2) {
int i,j,sum;
sum=0;
if (s[x1][y1][x2][y2]!=0)
return;
for (i=x1;i<=x2;i++) {
for (j=y1;j<=y2;j++) {
sum=sum+data[i][j];
}
}
s[x1][y1][x2][y2]=sum*sum;
}
int min_num(int a,int b) {
if (a>b)
return b;
return a;
}
int main()
{
int i,j,k,g,h,l,temp;
double sum,average,result;
scanf("%d",&n);
sum=0;
for (i=1;i<=8;i++) {
for (j=1;j<=8;j++) {
scanf("%d",&data[i][j]);
sum+=data[i][j];
}
}
average=sum/n;
memset(s,0,sizeof(s));
for (i=1;i<=8;i++) {
for (j=1;j<=8;j++) {
for (g=i;g<=8;g++) {
for (h=j;h<=8;h++) {
get_sum(i,j,g,h);
dp[0][i][j][g][h]=s[i][j][g][h];
}
}
}
}
for (k=1;k<n;k++) {
for (i=1;i<=8;i++) {
for (j=1;j<=8;j++) {
for (g=i;g<=8;g++) {
for (h=j;h<=8;h++) {
dp[k][i][j][g][h]=10000000;
for (l=i;l<g;l++) {
get_sum(l+1,j,g,h);
temp=min_num(dp[k-1][i][j][l][h]+s[l+1][j][g][h],dp[k-1][l+1][j][g][h]+s[i][j][l][h]);
dp[k][i][j][g][h]=min_num(temp, dp[k][i][j][g][h]);
}
for (l=j;l<h;l++) {
get_sum(i,l+1,g,h);
temp=min_num(dp[k-1][i][j][g][l]+s[i][l+1][g][h],dp[k-1][i][l+1][g][h]+s[i][j][g][l]);
dp[k][i][j][g][h]=min_num(temp, dp[k][i][j][g][h]);
}
}
}
}
}
}
result=(double)dp[n-1][1][1][8][8]/n-average*average;
printf("%.3lf
",sqrt(result));
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Linux Shell 프로 그래 밍 - 텍스트 처리 grep, sed사용자 가 지정 한 '모드' 에 따라 대상 텍스트 를 일치 하 게 검사 하고 일치 하 는 줄 을 인쇄 합 니 다. ##포함 되 지 않 음, 역방향 일치 \ ##키워드 앞 뒤 가 맞지 않 고 키워드 만 일치 합 니 다...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.