Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
记忆化搜索也能 0ms AC,顺便总结下这题wa遇到的几个坑(附代码)1.你设置的最小值应当大于40960000,因为一个分块最大平方和是(64*100)^2 2.分块的时候竖切选左面和选右面是不同情况,横切同理 3.code #include <iostream> #include <math.h> #include <stdio.h> using namespace std; int board[9][9]; double x_bar; double dp[9][9][9][9][15]; inline double score(int a, int b, int c, int d) { double ans = 0; for (int i = a; i <= b; ++i) for (int j = c; j <= d; ++j) ans += board[i][j]; return ans; } double dfs(int a, int b, int c, int d, int n) { if (dp[a][b][c][d][n] != 0) return dp[a][b][c][d][n]; if (n == 1) { double t = score(a, b, c, d) - x_bar; dp[a][b][c][d][1] = t * t; return t * t; } double ans = 99999999; double t; for (int i = a + 1; i <= b; ++i) { t = score(a, i - 1, c, d) - x_bar; ans = min(ans, dfs(i, b, c, d, n - 1) + t * t); t = score(i, b, c, d) - x_bar; ans = min(ans, dfs(a, i - 1, c, d, n - 1) + t * t); } for (int i = c + 1; i <= d; ++i) { t = score(a, b, c, i - 1) - x_bar; ans = min(ans, dfs(a, b, i, d, n - 1) + t * t); t = score(a, b, i, d) - x_bar; ans = min(ans, dfs(a, b, c, i - 1, n - 1) + t * t); } dp[a][b][c][d][n] = ans; return ans; } int main() { int n; cin >> n; double sum = 0; for (int i = 1; i <= 8; ++i) for (int j = 1; j <= 8; ++j) { cin >> board[i][j]; sum += board[i][j]; } x_bar = sum / n; double ans = dfs(1, 8, 1, 8, n); ans = sqrt(ans / n); printf("%.3f", ans); } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator