您的位置:首页 > 其它

PKU 1191

2011-06-01 16:08 337 查看
#include <iostream>
#include <cmath>
using namespace std;
const int inf  = 1000000000;
const int maxs = 9;
const int maxn = 15;
int n;
int mat[maxs][maxs];
int dp[maxn][maxs][maxs][maxs][maxs];
void solve()
{
    int k, f, x1, y1, x2, y2;
    for (x1 = 1; x1 <= 8; x1++)
    {
        for (y1 = 1; y1 <= 8; y1++)
        {
            for (x2 = x1; x2 <= 8; x2++)
            {
                for (y2 = y1; y2 <= 8; y2++)
                {
                    int tmp = mat[x2][y2] - mat[x1-1][y2] - mat[x2][y1-1] + mat[x1-1][y1-1];
                    dp[0][x1][y1][x2][y2] = tmp * tmp;
                }
            }
        }
    }
    for (k = 1; k < n; k++)
    {
        for (x1 = 1; x1 <= 8; x1++)
        {
            for (y1 = 1; y1 <= 8; y1++)
            {
                for (x2 = x1; x2 <= 8; x2++)
                {
                    for (y2 = y1; y2 <= 8; y2++)
                    {
                        dp[k][x1][y1][x2][y2] = inf;
                        for (f = x1; f < x2; f++)
                        {
                            int tmp = min(dp[k-1][x1][y1][f][y2] + dp[0][f+1][y1][x2][y2],
                                          dp[0][x1][y1][f][y2] + dp[k-1][f+1][y1][x2][y2]);
                            if (tmp < dp[k][x1][y1][x2][y2])
                                dp[k][x1][y1][x2][y2] = tmp;
                        }
                        for (f = y1; f < y2; f++)
                        {
                            int tmp = min(dp[k-1][x1][y1][x2][f] + dp[0][x1][f+1][x2][y2],
                                          dp[0][x1][y1][x2][f] + dp[k-1][x1][f+1][x2][y2]);
                            if (tmp < dp[k][x1][y1][x2][y2])
                                dp[k][x1][y1][x2][y2] = tmp;
                        }
                    }
                }
            }
        }
    }
}
int main()
{
    int i, j;
    scanf("%d", &n);
    memset(mat, 0, sizeof(mat));
    memset(dp, 0, sizeof(dp));
    for (i = 1; i <= 8; i++)
    {
        for (j = 1; j <= 8; j++)
        {
            scanf("%d", &mat[i][j]);
            mat[i][j] = mat[i][j] + mat[i-1][j] + mat[i][j-1] - mat[i-1][j-1];
        }
    }
    double ave = 1.0 * mat[8][8] / n;
    solve();
    printf("%.3lf/n", sqrt(1.0 * dp[n-1][1][1][8][8] / n - ave * ave));
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: