poj 1191 矩形块的划分

思路:黑书的例题

#include<iostream>

#include<cstring>

#include<algorithm>

#include<cmath>

#include<cstdio>

#define Maxn 20

#define mul(a) ((a)*(a))

using namespace std;

int dp[16][9][9][9][9];

int s[10][10],val[10][10];

int S(int x1,int y1,int x2,int y2)

{

    return mul(s[x2][y2]-s[x2][y1-1]-s[x1-1][y2]+s[x1-1][y1-1]);

}

int main()

{

    int n,m,i,j;

    double avg;

    while(scanf("%d",&n)!=EOF)

    {

        memset(dp,70,sizeof(dp));

        memset(s,0,sizeof(s));

        for(i=1;i<=8;i++)

            for(j=1;j<=8;j++){

            scanf("%d",&val[i][j]);

            s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+val[i][j];

        }

        int 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++){

            dp[0][x1][y1][x2][y2]=S(x1,y1,x2,y2);

        }

        int a,b;

        for(i=1;i<=n-1;i++)

        for(x1=7;x1>=1;x1--)

        for(y1=7;y1>=1;y1--)

        for(x2=x1;x2<=8;x2++)

        for(y2=y1;y2<=8;y2++){

            int temp;

            for(a=x1;a<x2;a++){

            temp=min(dp[i-1][x1][y1][a][y2]+S(a+1,y1,x2,y2),dp[i-1][a+1][y1][x2][y2]+S(x1,y1,a,y2));

            dp[i][x1][y1][x2][y2]=min(temp,dp[i][x1][y1][x2][y2]);

            }

            for(b=y1;b<y2;b++){

            temp=min(dp[i-1][x1][y1][x2][b]+S(x1,b+1,x2,y2),dp[i-1][x1][b+1][x2][y2]+S(x1,y1,x2,b));

            dp[i][x1][y1][x2][y2]=min(dp[i][x1][y1][x2][y2],temp);

            }

        }

        double ans;

        avg=s[8][8]*1.0/(n*1.0);

        ans=(double)dp[n-1][1][1][8][8];

        ans=ans/(n*1.0);

        ans-=avg*avg;

        printf("%.3lf\n",sqrt(ans));

    }

    return 0;

}

 

你可能感兴趣的:(poj)