poj 1191 动态规划

题意:棋盘分割   黑书P116

 

 

int a[8][8];
int n;
double SUM;
int dp[15][8][8][8][8];

int P(int x1, int y1, int x2, int y2){
    int s=0;
    FOE(i, x1, x2) FOE(j, y1, y2) s+=a[i][j];
    return s * s;
}

void readData(){
    cin>>n;
    FOR(i, 0, 8) FOR(j, 0, 8){
        cin>>a[i][j];
        SUM+=a[i][j];
    }
}

int solve(int k,int x1,int y1,int x2,int y2){
    if(dp[k][x1][y1][x2][y2]) return dp[k][x1][y1][x2][y2];

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

    int Max=99999999;
    FOR(i, x1, x2){
        int t1=solve(k-1,x1,y1,i,y2)+P(i+1,y1,x2,y2);
        int t2=solve(k-1,i+1,y1,x2,y2)+P(x1,y1,i,y2);
        checkmin(Max, min(t1, t2));
    }
    FOR(j, y1, y2){
        int t1=solve(k-1,x1,y1,x2,j)+P(x1,j+1,x2,y2);
        int t2=solve(k-1,x1,j+1,x2,y2)+P(x1,y1,x2,j);
        checkmin(Max, min(t1, t2));
    }
    dp[k][x1][y1][x2][y2] = Max;
    return dp[k][x1][y1][x2][y2];
}

int main(){
    readData();
    double m=(double)solve(n,0,0,7,7)/n- SUM/n* SUM/n;
    cout<<fixed<<setprecision(3)<<sqrt(m)<<endl;
    return 0;
}

 

posted @ 2013-06-18 13:53  心向往之  阅读(202)  评论(0编辑  收藏  举报