poj 1191

#include <iostream>
#include <algorithm>
#include <queue>
#include <cstring>
#include <cstdio>
#include <vector>
#include <string>
#include <iterator>
#include <cmath>
#include <deque>
#include <stack>
#include <cctype>
#include <iomanip>
using namespace std;

typedef long long ll;
typedef long double ld;

const int N = 1100;
const int INF = 0xfffffff;
const double EPS = 1e-8;
const ll MOD = 1e9 + 7;
const ld PI = acos (-1.0);

#define INFL 0x7fffffffffffffffLL
#define met(a, b) memset(a, b, sizeof(a))
#define put(a) cout << setiosflags(ios::fixed) << setprecision(a)

int dp[16][9][9][9][9], sum[9][9]; //左上角为1 1的矩阵和
int cut (int k, int x1, int y1, int x2, int y2);
int getsum (int x1, int y1, int x2, int y2);

int main ()
{
    int n;
    while (cin >> n)
    {
        int x, cot = 0;
        met (dp, -1);
        met (sum, 0);
        for (int i=1; i<9; i++)
            for (int j=1; j<9; j++)
            {
                cin >> x;
                cot += x;
                sum[i][j] = x + sum[i][j-1] + sum[i-1][j] - sum[i-1][j-1];
            }
            double avr = cot * 1.0 / n;
            int res = cut (n, 1, 1, 8, 8);
            double ans = sqrt (res * 1.0 / n - avr * avr);
            printf ("%.3f\n", ans);
    }
    return 0;
}


int getsum (int x1, int y1, int x2, int y2)
{
    return sum[x2][y2] - sum[x1-1][y2] - sum[x2][y1-1] + sum[x1-1][y1-1];
}

int cut (int k, int x1, int y1, int x2, int y2)
{
    int s1, s2;

    if (dp[k][x1][y1][x2][y2] != -1) return dp[k][x1][y1][x2][y2];

    if (k == 1)
    {
        s1 = getsum (x1, y1, x2, y2);
        return dp[k][x1][y1][x2][y2] = s1 * s1;
    }

    int minx = INF, tmp1, tmp2;
    for (int x=x1; x<x2; x++)
    {
        s1 = getsum (x1, y1, x, y2);
        s2 = getsum (x+1, y1, x2, y2);
        tmp1 = min (cut (k-1, x+1, y1, x2, y2) + s1*s1, cut(k-1, x1, y1, x, y2) + s2*s2);
        minx = min (minx, tmp1);
    }

    for (int y=y1; y<y2; y++)
    {
        s1 = getsum (x1, y1, x2, y);
        s2 = getsum (x1, y+1, x2, y2);
        tmp2 = min (cut(k-1, x1, y+1, x2, y2) + s1*s1, cut(k-1, x1, y1, x2, y) + s2*s2);
        minx = min (minx, tmp2);
    }

    return dp[k][x1][y1][x2][y2] = minx;
}

《算法艺术与信息学竞赛》的116页有讲解,先将方差公式化简,最终确定只需求切割n-1次后n块矩形中每块矩形的总分的平方的和最小。

设这个平方和为res,最终的答案就为res/n-avrg^2开根号

wa的几个地方提示:

用double   %.3lf 输出  G++ wa  c++ ac

用double %.3f 输出 G++ ac  c++ ac


要是正规比赛 怎么能想到坑在这 虽然不知道为什么 但是先记住了




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值