1191 棋盘分割
2010-05-26 23:50
253 查看
#include < iostream >
#include
< cmath >
#define INF 10000000
using namespace
std;
const int m = 8 ;
int a[ 10 ][ 10
];
int n;
double dp[ 16 ][ 10 ][ 10 ][ 10 ][ 10 ], s[ 10 ][ 10 ][ 10 ][ 10
];
/**/ /*
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]);
*/
double mmin( double a,
double b)
{
return a < b ? a: b;
}
int
main()
{
// freopen("data.txt", "r", std);
int x1, y1,
x2, y2, t, f;
double sum, average, temp;
while (cin >> n)
{
sum = 0 ;
for (x1 = 0 ; x1 < m; x1 ++
)
for (y1 = 0 ; y1 < m; y1 ++ ) {
cin
>> a[x1][y1];
sum += a[x1][y1];
}
average = sum / n;
// 计算s[x1][y1][x2][y2]
没有平方只是简单的和而已
for (x1 = 0 ; x1 < m; x1 ++ ) {
for (y1 = 0 ; y1 < m; y1 ++ ) {
for (x2 = x1; x2 <
m; x2 ++ ) {
sum = 0 ;
for (y2
= y1; y2 < m; y2 ++ ) {
sum +=
a[x2][y2];
if (x1 ==
x2)
s[x1][y1][x2][y2] =
sum;
else
s[x1][y1][x2][y2] = s[x1][y1][x2 - 1 ][y2] + sum;
}
}
}
}
//
进行初始列的初始化工作不抛弃不放弃继续continue的向前工作
for (x1 = 0 ; x1 < m; x1 ++ )
{
for (y1 = 0 ; y1 < m; y1 ++ ) {
for
(x2 = x1; x2 < m; x2 ++ ) {
for (y2 = y1; y2 < m;
y2 ++ ) {
s[x1][y1][x2][y2] *=
s[x1][y1][x2][y2];
dp[ 0 ][x1][y1][x2][y2] =
s[x1][y1][x2][y2];
}
}
}
}
for (t = 1 ; t < n; t ++
) {
for (x1 = 0 ; x1 < m; x1 ++ ) {
for
(y1 = 0 ; y1 < m; y1 ++ ) {
for (x2 = x1; x2 <
m; x2 ++ ) {
for (y2 = y1; y2 < m; y2 ++ )
{
dp[t][x1][y1][x2][y2] =
INF;
for (f = x1; f < x2; f ++ )
{
temp = mmin(dp[t - 1 ][x1][y1][f][y2] + s[f
+ 1 ][y1][x2][y2]
, dp[t - 1 ][f + 1
][y1][x2][y2] + s[x1][y1][f][y2]);
dp[t][x1][y1][x2][y2] = mmin(temp,
dp[t][x1][y1][x2][y2]);
}
for (f = y1; f < y2; f ++ )
{
temp = mmin(dp[t - 1 ][x1][y1][x2][f] +
s[x1][f + 1 ][x2][y2]
, dp[t - 1 ][x1][f
+ 1 ][x2][y2] + s[x1][y1][x2][f]);
dp[t][x1][y1][x2][y2] = mmin(temp,
dp[t][x1][y1][x2][y2]);
}
}
}
}
}
}
double ans;
ans = dp[n - 1 ][ 0 ][ 0 ][m - 1 ][m - 1 ] / n - average * average;
printf( "%.3llf/n " , sqrt(ans));
}
return 0 ;
}
#include
< cmath >
#define INF 10000000
using namespace
std;
const int m = 8 ;
int a[ 10 ][ 10
];
int n;
double dp[ 16 ][ 10 ][ 10 ][ 10 ][ 10 ], s[ 10 ][ 10 ][ 10 ][ 10
];
/**/ /*
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]);
*/
double mmin( double a,
double b)
{
return a < b ? a: b;
}
int
main()
{
// freopen("data.txt", "r", std);
int x1, y1,
x2, y2, t, f;
double sum, average, temp;
while (cin >> n)
{
sum = 0 ;
for (x1 = 0 ; x1 < m; x1 ++
)
for (y1 = 0 ; y1 < m; y1 ++ ) {
cin
>> a[x1][y1];
sum += a[x1][y1];
}
average = sum / n;
// 计算s[x1][y1][x2][y2]
没有平方只是简单的和而已
for (x1 = 0 ; x1 < m; x1 ++ ) {
for (y1 = 0 ; y1 < m; y1 ++ ) {
for (x2 = x1; x2 <
m; x2 ++ ) {
sum = 0 ;
for (y2
= y1; y2 < m; y2 ++ ) {
sum +=
a[x2][y2];
if (x1 ==
x2)
s[x1][y1][x2][y2] =
sum;
else
s[x1][y1][x2][y2] = s[x1][y1][x2 - 1 ][y2] + sum;
}
}
}
}
//
进行初始列的初始化工作不抛弃不放弃继续continue的向前工作
for (x1 = 0 ; x1 < m; x1 ++ )
{
for (y1 = 0 ; y1 < m; y1 ++ ) {
for
(x2 = x1; x2 < m; x2 ++ ) {
for (y2 = y1; y2 < m;
y2 ++ ) {
s[x1][y1][x2][y2] *=
s[x1][y1][x2][y2];
dp[ 0 ][x1][y1][x2][y2] =
s[x1][y1][x2][y2];
}
}
}
}
for (t = 1 ; t < n; t ++
) {
for (x1 = 0 ; x1 < m; x1 ++ ) {
for
(y1 = 0 ; y1 < m; y1 ++ ) {
for (x2 = x1; x2 <
m; x2 ++ ) {
for (y2 = y1; y2 < m; y2 ++ )
{
dp[t][x1][y1][x2][y2] =
INF;
for (f = x1; f < x2; f ++ )
{
temp = mmin(dp[t - 1 ][x1][y1][f][y2] + s[f
+ 1 ][y1][x2][y2]
, dp[t - 1 ][f + 1
][y1][x2][y2] + s[x1][y1][f][y2]);
dp[t][x1][y1][x2][y2] = mmin(temp,
dp[t][x1][y1][x2][y2]);
}
for (f = y1; f < y2; f ++ )
{
temp = mmin(dp[t - 1 ][x1][y1][x2][f] +
s[x1][f + 1 ][x2][y2]
, dp[t - 1 ][x1][f
+ 1 ][x2][y2] + s[x1][y1][x2][f]);
dp[t][x1][y1][x2][y2] = mmin(temp,
dp[t][x1][y1][x2][y2]);
}
}
}
}
}
}
double ans;
ans = dp[n - 1 ][ 0 ][ 0 ][m - 1 ][m - 1 ] / n - average * average;
printf( "%.3llf/n " , sqrt(ans));
}
return 0 ;
}
相关文章推荐
- poj 1191 棋盘分割 动态规划
- poj 1191(棋盘分割)
- POJ 1191 棋盘分割 简单记忆化dfs
- POJ 1191 棋盘分割(记忆化搜索)
- poj-1191- 棋盘分割dp
- POJ1191 棋盘分割
- Poj 1191 棋盘分割
- POJ 1191 棋盘分割
- POJ 1191 棋盘分割
- POJ1191棋盘分割 NYOJ87
- poj 1191 棋盘分割
- poj 1191 棋盘分割(记忆化搜索/动态规划)
- POJ 1191 && HDU 2517 棋盘分割(dp)
- POJ 1191 棋盘分割
- 【动态规划+递归】:poj1191,棋盘分割
- POJ 1191 棋盘分割
- poj - 1191 - 棋盘分割(dp)
- 棋盘分割----POJ1191----DP
- poj 1191 棋盘分割 公式转换,横纵方向动态规划
- poj-1191- 棋盘分割dp