SRM532 D2 L3
2012-02-23 15:13
204 查看
Problem Statement
题目大意是给定一个N*M的棋盘,然后棋盘上染色,要求染色满足这样的条件,染色块的四领域内的染色块数为偶数。
用dp[i][j][k]表示1..i行,第i行放置状态为j,奇偶性为k的方案数,用f[i][j][k]表示放置状态为j,奇偶性对应为k的方案数,其中判断奇偶性时用到二进制处理,最后的复杂度为O(N*4^M),
内存方面要用滚动数组优化,解题报告的做法是用三进制,本来没用到f[i][j][k],实现了一个O(N*8^M)的算法,就是在状态转移的时候又枚举了一下,这样在TC上会超时,
用了一个中间数组f存储了中间结果,并优化下存储就可以了~
题目大意是给定一个N*M的棋盘,然后棋盘上染色,要求染色满足这样的条件,染色块的四领域内的染色块数为偶数。
用dp[i][j][k]表示1..i行,第i行放置状态为j,奇偶性为k的方案数,用f[i][j][k]表示放置状态为j,奇偶性对应为k的方案数,其中判断奇偶性时用到二进制处理,最后的复杂度为O(N*4^M),
内存方面要用滚动数组优化,解题报告的做法是用三进制,本来没用到f[i][j][k],实现了一个O(N*8^M)的算法,就是在状态转移的时候又枚举了一下,这样在TC上会超时,
用了一个中间数组f存储了中间结果,并优化下存储就可以了~
using namespace std; #include <iostream> using namespace std; const int M = 1000000007; typedef long long int64; int64 dp[2][1 << 8][1 << 8], f[2][1 << 8][1 << 8]; class DengklekPaintingSquares { public: int numSolutions(int m, int n) { memset(dp, 0, sizeof(dp)); memset(f, 0, sizeof(f)); dp[0][0][0] = 1; f[0][0][0] = 1; for(int i = 1; i <= m + 1; i++) { memset(dp[i & 1], 0, sizeof(dp[i & 1])); memset(f[i & 1], 0, sizeof(f[i & 1])); for(int j = 0; j < (1 << n); j++) { for(int k = 0; k < (1 << n); k++) { int dj = (j >> 1) ^ ((j << 1) & ((1 << n) - 1)) ^ k; dp[i & 1][j][k] += f[(i + 1) & 1][dj][dj & j]; dp[i & 1][j][k] %= M; f[i & 1][j][j & k] += dp[i & 1][j][k]; f[i & 1][j][j & k] %= M; } } } return f[(m + 1) & 1][0][0]; } };
相关文章推荐
- SRM 581 D2 L3:TreeUnionDiv2,Floyd算法
- SRM 603 D2 L3:GraphWalkWithProbabilities
- SRM 601 D2 L3:WinterAndReindeers,dp
- SRM 588 D2 L3:GameInDarknessDiv2,DFS
- SRM 608 D2 L3:BigOEasy,DFS
- SRM 576 D2 L3:CharacterBoard2
- SRM 588 D2 L3:GameInDarknessDiv2,DFS
- SRM 606 D2 L3:EllysCandyGame
- SRM 607 D2 L3:CombinationLockDiv2,DP
- SRM 595 D2 L3:LittleElephantAndXor, dp
- SRM 605 D2 L3: AlienAndSetDiv2,DP
- SRM 596 D2 L3:SparseFactorialDiv2,math
- SRM 581 D2 L3:TreeUnionDiv2,Floyd算法
- SRM 581 D2 L2:SurveillanceSystem,重叠度
- SRM 588 D2 L2:GUMIAndSongsDiv2,冷静思考,好的算法简洁明了
- SRM 607 L2 D2:PalindromicSubstringsDiv2,DP
- srm 532
- Topcoder SRM 709 DIV 2 500pt Permatchd2 solution
- SRM532 D1 L2
- SRM 576 D2 L2:ArcadeManao,DFS,善于根据实际问题使用最简便的方法