您的位置:首页 > 其它

poj 1191 DP

2014-03-02 19:43 253 查看
黑书上讲的很清楚。。。。

AC代码如下:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;

#define MAX 0x3f3f3f3f

int dp[17][17][17][17][17];
int num[17][17], sum[17][17];
int N;

int DFS( int steps, int x1, int y1, int x2, int y2 ){
int temp = sum[x2][y2] - sum[x2][y1-1] - ( sum[x1-1][y2] - sum[x1-1][y1-1] );
if( steps == 1 ){
return temp * temp;
}
if( dp[steps][x1][y1][x2][y2] != -1 ){
return dp[steps][x1][y1][x2][y2];
}
int ans = MAX;
for( int i = x1; i < x2; i++ ){
int temp1 = sum[i][y2] - sum[i][y1-1] - ( sum[x1-1][y2] - sum[x1-1][y1-1] );
int temp2 = temp - temp1;
ans = min( ans, temp1 * temp1 + DFS( steps - 1, i + 1, y1, x2, y2 ) );
ans = min( ans, temp2 * temp2 + DFS( steps - 1, x1, y1, i, y2 ) );
}
for( int i = y1; i < y2; i++ ){
int temp1 = sum[x2][i] - sum[x2][y1-1] - ( sum[x1-1][i] - sum[x1-1][y1-1] );
int temp2 = temp - temp1;
ans = min( ans, temp1 * temp1 + DFS( steps - 1, x1, i + 1, x2, y2 ) );
ans = min( ans, temp2 * temp2 + DFS( steps - 1, x1, y1, x2, i ) );
}
return dp[steps][x1][y1][x2][y2] = ans;
}

int main(){
while( scanf( "%d", &N ) != EOF ){
memset( dp, -1, sizeof( dp ) );
memset( num, 0, sizeof( num ) );
memset( sum, 0, sizeof( sum ) );
for( int i = 1; i <= 8; i++ ){
int temp = 0;
for( int j = 1; j <= 8; j++ ){
scanf( "%d", &num[i][j] );
temp += num[i][j];
sum[i][j] = sum[i-1][j] + temp;
}
}
double temp1 = DFS( N, 1, 1, 8, 8 );
double temp2 = (double)sum[8][8] / (double)N;
double ans = temp1 / N - temp2 * temp2;
printf( "%.3lf\n", sqrt( ans ) );
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: