NOI 193棋盤分割 cpp

2021-09-19 02:55:14 字數 3165 閱讀 1426

總時間限制: 

1000ms

記憶體限制: 

65536kb

描述將乙個8*8的棋盤進行如下分割:將原棋盤割下一塊矩形棋盤並使剩下部分也是矩形,再將剩下的部分繼續如此分割,這樣割了(n-1)次後,連同最後剩下的矩形棋盤共有n塊矩形棋盤。(每次切割都只能沿著棋盤格仔的邊進行)

原棋盤上每一格有乙個分值,一塊矩形棋盤的總分為其所含各格分值之和。現在需要把棋盤按上述規則分割成n塊矩形棋盤,並使各矩形棋盤總分的均方差最小。

均方差請程式設計對給出的棋盤及n,求出o'的最小值。

輸入第1行為乙個整數n(1 < n < 15)。

第2行至第9行每行為8個小於100的非負整數,表示棋盤上相應格仔的分值。每行相鄰兩數之間用乙個空格分隔。

輸出僅乙個數,為o'(四捨五入精確到小數點後三位)。

樣例輸入

3

1 1 1 1 1 1 1 3

1 1 1 1 1 1 1 1

1 1 1 1 1 1 1 1

1 1 1 1 1 1 1 1

1 1 1 1 1 1 1 1

1 1 1 1 1 1 1 1

1 1 1 1 1 1 1 0

1 1 1 1 1 1 0 3

樣例輸出

1.633
**

noi 99

1/*2

z3*/4 #include5 #include6 #include7 #include8

#define inf 0x3f3f3f3f

9using

namespace

std;

10int

n;11

int s[9][9][9][9],c[9][9

];12

int f[20][9][9][9][9

];13

int add(int x1,int y1,int x2,int

y2 )

1421

int dfs(int k,int x1,int y1,int x2,int

y2)2235}

36if(y1

3745}46

return

f[k][x1][y1][x2][y2];47}

48int

main()

4964 dfs(n,1,1,8,8

);65

double

x,ans;

66 x=1.*add(1,1,8,8

);67 x=(x/n)*(x/n);

68//

cout<69 ans=sqrt(1.0*f[n][1][1][8][8]/n-x);

70 printf("

%.3f\n

",ans);

71return0;

72 }

#include #include 

#include

#include

#define min(a,b) a#define inf 0x3f3f3f3f

#define n 20

using

namespace

std;

int dp[n][10][10][10][10],s[10][10][10][10],c[10][10

];int add(int x1,int y1,int x2,int

y2)int dfs(int k,int x1,int y1,int x2,int

y2) }

if(y2>y1) //

至少有兩列才能豎著切

}return

dp[k][x1][y1][x2][y2];

}int

main()

dfs(n,

1,1,8,8

);

double

x,ans;

x=1.*add(1,1,8,8

); x=(x/n)*(x/n);

cout

ans=sqrt(1.0*dp[n][1][1][8][8]/n-x);

printf(

"%.3f\n

",ans);

return0;

}

1   1   1   1   1   1   1   3

1   1   1   1   1   1   1   1

1   1   1   1   1   1   1   1

1   1   1   1   1   1   1   1

1   1   1   1   1   1   1   1

1   1   1   1   1   1   1   1

1   1   1   1   1   1   1   0

1   1   1   1   1   1   0   3

狀態的描述:

1.矩形區域,採用excel的方法

左上角(x1,y1):右下角(x2,y2)

2.狀態:

f(i,x1,y1,x2,y2)表示

把(x1,y1):(x2,y2)分割成i塊的最小segma((x-

x)^2)。

對任意的矩形區域,i=1時的f值可以直接求得。

3.狀態轉移:f(i,x1,y1,x2,y2)

(1)列舉x1<=x(x1,y1):(x,y2) (x+1,y1):(x2,y2)

把(x1,y1):(x,y2)分割成(i-1)矩形:f(i-1,x1,y1,x,y2)

(x+1,y1):(x2,y2)作為1個矩形: f(1,x+1,y1,x2,y2)

或者f(1,x1,y1,x,y2)+f(i-1,x+1,y1,x2,y2)

(2)同理,列舉y1<=y(x1,y1):(x2,y) (x1,y+1):(x2,y2)

f(i-1,x1,y1,x2,y)+f(1,x1,y+1,x2,y2)

f(1,x1,y1,x2,y)+f(i-1,x1,y+1,x2,y2)

posted @

2016-04-09 10:26

minepressure 閱讀(

...)

編輯收藏

NOI1999 poj1191 棋盤分割

description 將乙個 的棋盤進行如下分割 將原棋盤割下一塊矩形棋盤並使剩下部分也是矩形,再將剩下的部分繼續如此分割,這樣割了 n 1 次後,連同最後剩下的矩形棋盤共有n塊矩形棋盤。每次切割都只能沿著棋盤格仔的邊進行 原棋盤上每一格有乙個分值,一塊矩形棋盤的總分為其所含各格分值之和。現在需要...

F 棋盤分割

將乙個 的棋盤進行如下分割 將原棋盤割下一塊矩形棋盤並使剩下部分也是矩形,再將剩下的部分繼續如此分割,這樣割了 n 1 次後,連同最後剩下的矩形棋盤共有n塊矩形棋盤。每次切割都只能沿著棋盤格仔的邊進行 原棋盤上每一格有乙個分值,一塊矩形棋盤的總分為其所含各格分值之和。現在需要把棋盤按上述規則分割成n...

遞迴 棋盤分割問題

language default 棋盤分割 time limit 1000ms memory limit 10000k total submissions 11819 accepted 4175 description 將乙個 的棋盤進行如下分割 將原棋盤割下一塊矩形棋盤並使剩下部分也是矩形,再將剩...