poj 1191 棋盘分割 记忆化搜索
2012-09-15 22:27
435 查看
纠结了一天,奇葩的代码,dp初始化的时候,用memset(dp, 0x3f, sizeof(dp)),记忆化搜索判断用 if( dp[tim][x1][y1][x2][y2] == 0x3f3f3f3f),TLE了整整一晚上,后来随便换成用-1做判断条件就A掉了,还0ms……又去试了下是不是poj里面dp[tim][x1][y1][x2][y2] == 0x3f3f3f3f会出问题,用a+b代码试了下,完全没问题啊……
还是不知道到底哪挫了…………………………
白天写的时候,没有化简方差公式,用一个area存每一块的面积,用一个th数组存储dfs累加的 (xi - avg)*(xi - avg) 的最小值,不知道哪有问题,写了好多遍也不对,后来看黑书上,按化简的方差公式写,过样例,然后就开始上面的 endless TLE …………
很简单的记忆化搜索
for( k= x1; k<x2; k++){
mm =min( mm, dfs( tim-1, x1, y1, k, y2) + get_var( k+1, y1, x2, y2));
mm =min( mm, dfs( tim-1, k+1, y1, x2, y2) + get_var( x1, y1, k, y2));
}
for( k= y1; k<y2; k++){
mm =min( mm, dfs( tim-1, x1, y1, x2, k) + get_var( x1, k+1, x2, y2));
mm =min( mm, dfs( tim-1, x1, k+1, x2, y2) + get_var( x1, y1, x2, k));
}
dp[tim][x1][y1][x2][y2] = mm;
把目前的这块(范围 x1, y1, x2, y2 ) 分为两部分, 一部分算分出去的,计算其大小,供最后处理方差,另一部分dfs,继续进行分割
还是不知道到底哪挫了…………………………
白天写的时候,没有化简方差公式,用一个area存每一块的面积,用一个th数组存储dfs累加的 (xi - avg)*(xi - avg) 的最小值,不知道哪有问题,写了好多遍也不对,后来看黑书上,按化简的方差公式写,过样例,然后就开始上面的 endless TLE …………
很简单的记忆化搜索
for( k= x1; k<x2; k++){
mm =min( mm, dfs( tim-1, x1, y1, k, y2) + get_var( k+1, y1, x2, y2));
mm =min( mm, dfs( tim-1, k+1, y1, x2, y2) + get_var( x1, y1, k, y2));
}
for( k= y1; k<y2; k++){
mm =min( mm, dfs( tim-1, x1, y1, x2, k) + get_var( x1, k+1, x2, y2));
mm =min( mm, dfs( tim-1, x1, k+1, x2, y2) + get_var( x1, y1, x2, k));
}
dp[tim][x1][y1][x2][y2] = mm;
把目前的这块(范围 x1, y1, x2, y2 ) 分为两部分, 一部分算分出去的,计算其大小,供最后处理方差,另一部分dfs,继续进行分割
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <cmath> using namespace std; const int INF= 0x3f3f3f3f; int dp[16][9][9][9][9], n, mit[9][9], ans[9][9], area[9][9][9][9]; int get_var(int x1, int y1, int x2, int y2){ if( area[x1][y1][x2][y2] != -1) return area[x1][y1][x2][y2]; int tmp = ans[x2][y2] - ans[x1-1][y2] - ans[x2][y1-1] + ans[x1-1][y1-1]; return area[x1][y1][x2][y2] = tmp*tmp; } int dfs(int tim, int x1, int y1, int x2, int y2){ if( dp[tim][x1][y1][x2][y2] != -1) return dp[tim][x1][y1][x2][y2] ; if( tim == 0){ dp[tim][x1][y1][x2][y2] = get_var( x1, y1, x2, y2); return dp[tim][x1][y1][x2][y2] ; } int k, s, s1, s2, mm= INF; for( k= x1; k<x2; k++){ mm =min( mm, dfs( tim-1, x1, y1, k, y2) + get_var( k+1, y1, x2, y2)); mm =min( mm, dfs( tim-1, k+1, y1, x2, y2) + get_var( x1, y1, k, y2)); } for( k= y1; k<y2; k++){ mm =min( mm, dfs( tim-1, x1, y1, x2, k) + get_var( x1, k+1, x2, y2)); mm =min( mm, dfs( tim-1, x1, k+1, x2, y2) + get_var( x1, y1, x2, k)); } return ( dp[tim][x1][y1][x2][y2] = mm); } int main(){ // freopen("1.txt", "r", stdin); int i, j, k; int aa[2][2][2][2][2]; double avg, ss; while( scanf("%d", &n) != EOF){ memset( ans, 0, sizeof(ans)); memset( area, -1, sizeof( area)); for( i= 1; i< 9; i++){ for( j= 1; j< 9; j++){ scanf("%d", &mit[i][j]); ans[i][j]= ans[i-1][j] + ans[i][j-1] + mit[i][j] - ans[i-1][j-1]; } } avg= ans[8][8]*1.0/n; memset(dp, -1, sizeof( dp)); dfs(n-1, 1, 1, 8, 8); memset(aa, INF, sizeof( INF)); ss= sqrt(fabs(dp[n-1][1][1][8][8]*1.0/n - avg*avg)); printf("%.3f\n", ss); } return 0; }
相关文章推荐
- poj1191 棋盘分割(记忆化搜索)
- POJ 1191-棋盘分割(记忆化搜索)
- poj 1191棋盘分割(递归dp, 记忆化搜索)
- POJ-1191 棋盘分割 记忆化搜索
- POJ 1191 棋盘分割(记忆化搜索)
- POJ 1191 棋盘分割 (记忆化搜索)
- poj1191——分割棋盘求最小均方差,记忆化搜索
- POJ 1191 棋盘分割 (记忆化搜索)
- poj 1191 棋盘分割(dp + 记忆化搜索)
- POJ 1191 棋盘分割 (DP)
- poj 1191 棋盘分割(dp)
- poj_1191 棋盘分割(dp记忆化搜索)
- poj 1191 棋盘分割(记忆化dp+递归)
- poj 1191(棋盘分割)
- poj 1191 棋盘分割(记忆化搜索/动态规划)
- POJ 1191 棋盘分割(DP)
- POJ-1191 棋盘分割 动态规划
- POJ1191 棋盘分割
- POJ-1191 棋盘分割
- POJ 1191 棋盘分割