SRM 573 div2
2013-03-21 19:55
375 查看
250...
500...
1000
比赛的时候没思路。倒是想到一种trick,想cha人来着,后来发现房间里没有人提交。。。
只想到了预处理出从一个点到另一个点走m步所要用到的情况数,发现dp空间复杂度太高。今天看了一下别人怎么预处理的,我还是太嫩啊。。。
dp[dx][dy][m]表示走m步坐标移动了(dx, dy)所有的情况数。
记忆化搜索一下。
500...
1000
比赛的时候没思路。倒是想到一种trick,想cha人来着,后来发现房间里没有人提交。。。
只想到了预处理出从一个点到另一个点走m步所要用到的情况数,发现dp空间复杂度太高。今天看了一下别人怎么预处理的,我还是太嫩啊。。。
dp[dx][dy][m]表示走m步坐标移动了(dx, dy)所有的情况数。
记忆化搜索一下。
const int MAXN = 55; const int MOD = 1e9+7; int dp[MAXN][MAXN][MAXN]; int dir[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}}; class WolfPackDivTwo { public: int dfs(int dx, int dy, int m) { if(dp[dx][dy][m] != -1) return dp[dx][dy][m]; int res = 0; if(m == 0) { res = (dx == 0 && dy == 0); } else { for(int i = 0; i < 4; ++i) { int xx = abs(dx + dir[i][0]); int yy = abs(dy + dir[i][1]); if(xx + yy > m - 1) continue; res = (res + dfs(xx, yy, m - 1))%MOD; } } return dp[dx][dy][m] = res; } int calc(vector <int> x, vector <int> y, int m) { int n = x.size(), tx, ty, i, ans = 0; CL(dp, -1); for(tx = x[0] - m; tx <= x[0] + m; ++tx) { for(ty = y[0] - m; ty <= y[0] + m; ++ty) { int tmp = 1; for(i = 0; i < n; ++i) { int dx = abs(tx - x[i]); int dy = abs(ty - y[i]); if(dx + dy > m) {tmp = 0; continue;} tmp = (tmp*dfs(dx, dy, m))%MOD; } ans = (ans + tmp)%MOD; } } return ans; } };
相关文章推荐
- SRM 573 div1 lev2(状态图上的最短路)
- SRM 573 250 DIV2
- Topcoder SRM 573 WolfPackDivTwo
- SRM DIV2 573 TeamContestEasy
- SRM573 Div1
- 【动态规划】TopCoder SRM 573 division2 WolfPackDivTwo
- SRM 573 DIV2
- Top Coder SRM 614 DIV 2
- SRM 579 Div II Level Two: UndoHistory
- SRM DIV2 574 TheNumberGameDiv2
- SRM 587 Div II L3:ThreeColorabilityEasyy
- SRM 450 DIV 1 总结
- SRM 449 DIV 1 总结(550p标记下,下次做)
- TopCoder SRM 474 DIV1 1000
- topcoder SRM 501 div1 level1
- SRM 492 div1 level 2
- srm 545 div1
- srm 307 div2 1000(数论,枚举)
- TwoRectangles(SRM546-div2-2)
- SRM 593 Div1 L1:HexagonalBoard,用染色法判断无向图是否为二分图