【HDOJ】4363 Draw and paint
看题解解的。将着色方案映射为40*40*5*5*5*5*2个状态,40*40表示n*m,5*5*5*5表示上下左右相邻块的颜色,0表示未着色。
2表示横切或者竖切。
基本思路是记忆化搜索然后去重,关键点是可能未切前当前块已经着色了。
1 /* 4363 */ 2 #include <iostream> 3 #include <sstream> 4 #include <string> 5 #include <map> 6 #include <queue> 7 #include <set> 8 #include <stack> 9 #include <vector> 10 #include <deque> 11 #include <algorithm> 12 #include <cstdio> 13 #include <cmath> 14 #include <ctime> 15 #include <cstring> 16 #include <climits> 17 #include <cctype> 18 #include <cassert> 19 #include <functional> 20 #include <iterator> 21 #include <iomanip> 22 using namespace std; 23 //#pragma comment(linker,"/STACK:102400000,1024000") 24 25 #define sti set<int> 26 #define stpii set<pair<int, int> > 27 #define mpii map<int,int> 28 #define vi vector<int> 29 #define pii pair<int,int> 30 #define vpii vector<pair<int,int> > 31 #define rep(i, a, n) for (int i=a;i<n;++i) 32 #define per(i, a, n) for (int i=n-1;i>=a;--i) 33 #define clr clear 34 #define pb push_back 35 #define mp make_pair 36 #define fir first 37 #define sec second 38 #define all(x) (x).begin(),(x).end() 39 #define SZ(x) ((int)(x).size()) 40 #define lson l, mid, rt<<1 41 #define rson mid+1, r, rt<<1|1 42 43 const int mod = 1e9+7; 44 int dp[41][41][5][5][5][5][2]; 45 46 int calc(int x, int y, int u, int d, int l, int r, int dir) { 47 if (dp[x][y][u][d][l][r][dir] >= 0) 48 return dp[x][y][u][d][l][r][dir]; 49 50 int& ret = dp[x][y][u][d][l][r][dir]; 51 52 ret = 0; 53 if ((x==1&&dir==0) || (y==1&&dir==1)) { 54 rep(i, 1, 5) 55 if (i!=u && i!=d && i!=l && i!=r) 56 ++ret; 57 return ret; 58 } 59 60 if (dir) { 61 rep(i, 1, y) { 62 rep(j, 1, 5) { 63 if (j!=u && j!=d && j!=l) { 64 ret = (ret + calc(x, y-i, u, d, j, r, 0)) % mod; 65 } 66 if (j!=u && j!=d && j!=r) { 67 ret = (ret + calc(x, i, u, d, l, j, 0)) % mod; 68 } 69 } 70 } 71 72 int tmp = 0; 73 rep(i, 1, 5) { 74 if (i!=u && i!=d && i!=l) { 75 rep(j, 1, 5) { 76 if (j!=u && j!=d && j!=r && j!=i) 77 ++tmp; 78 } 79 } 80 } 81 82 ret = (ret + mod - tmp*(y-1)) % mod; 83 rep(i, 1, 5) 84 if (i!=u && i!=l && i!=r && i!=d) 85 ++ret; 86 87 ret %= mod; 88 } else { 89 rep(i, 1, x) { 90 rep(j, 1, 5) { 91 if (j!=u && j!=l && j!=r) { 92 ret = (ret + calc(x-i, y, j, d, l, r, 1)) % mod; 93 } 94 if (j!=d && j!=l && j!=r) { 95 ret = (ret + calc(i, y, u, j, l, r, 1)) % mod; 96 } 97 } 98 } 99 100 int tmp = 0; 101 rep(i, 1, 5) { 102 if (i!=u && i!=l && i!=r) { 103 rep(j, 1, 5) { 104 if (j!=d && j!=l && j!=r && j!=i) 105 ++tmp; 106 } 107 } 108 } 109 110 ret = (ret + mod - tmp*(x-1)) % mod; 111 rep(i, 1, 5) 112 if (i!=u && i!=l && i!=r && i!=d) 113 ++ret; 114 115 ret %= mod; 116 } 117 118 return ret; 119 } 120 121 int main() { 122 ios::sync_with_stdio(false); 123 #ifndef ONLINE_JUDGE 124 freopen("data.in", "r", stdin); 125 freopen("data.out", "w", stdout); 126 #endif 127 128 int t; 129 int n, m; 130 int ans; 131 132 memset(dp, -1, sizeof(dp)); 133 scanf("%d", &t); 134 while (t--) { 135 scanf("%d %d", &n, &m); 136 ans = calc(n, m, 0, 0, 0, 0, 0); 137 printf("%d\n", ans); 138 } 139 140 #ifndef ONLINE_JUDGE 141 printf("time = %d.\n", (int)clock()); 142 #endif 143 144 return 0; 145 }
转载于:https://www.cnblogs.com/bombe1013/p/5201289.html
【HDOJ】4363 Draw and paint相关推荐
- 【HDOJ】4602 Partition
[题目]http://acm.hdu.edu.cn/showproblem.php?pid=4602 [报告] 直接贴上标程解题报告:(虽然有些纠结,试一下就弄通了..) Problem C. Par ...
- 【HDOJ】4602 Partition_天涯浪子_新浪博客
[题目]http://acm.hdu.edu.cn/showproblem.php?pid=4602 [报告] 直接贴上标程解题报告:(虽然有些纠结,试一下就弄通了..) Problem C. Par ...
- 【HDOJ】1008 Elevator_天涯浪子_新浪博客
[题目] http://acm.hdu.edu.cn/showproblem.php?pid=1008 [报告] 这是我在HDOJ里看到的最水的题目,至少目前为止. 题目里已经讲得很清楚了,模拟就能过 ...
- 【HDOJ】1022 Train Problem I_天涯浪子_新浪博客
[题目]http://acm.hdu.edu.cn/showproblem.php?pid=1022 [报告] 模拟,直接模拟一个栈的运行就行了. [程序] // Task: 1022 Train P ...
- 【HDOJ】1003 Max Sum_天涯浪子_新浪博客
[题目]http://acm.hdu.edu.cn/showproblem.php?pid=1003 [报告] 既然是子区间加和问题,可以用减法来处理.比如求[5..10]的和,可以直接用[1..10 ...
- 【HDOJ】4768 Flyer_天涯浪子_新浪博客
[题目]http://acm.hdu.edu.cn/showproblem.php?pid=4768 [报告] 题目中已经说了,保证最多出现一个奇数,所以可以用异或的想法.把所有的数异或起来,如果最后 ...
- 【HDOJ】4699 Editor_天涯浪子_新浪博客
[题目] http://acm.hdu.edu.cn/showproblem.php?pid=4699 [报告] 模拟题吧,本身不是很难. 最初的想法是用Splay tree写,然后疯掉了.苏牛说2B ...
- 【HDOJ】4704 Sum_天涯浪子_新浪博客
[题目] http://acm.hdu.edu.cn/showproblem.php?pid=4704 [报告] S(K)显然就是N的K正整数划分数.所以SUM{S(K),1<=K<=N} ...
- 【HDOJ】1015 Safecracker_天涯浪子_新浪博客
[题目]http://acm.hdu.edu.cn/showproblem.php?pid=1015 [报告] 题目写的很长,忽略一系列废话,题意就是求一个方程v - w^2 + x^3 - y^4 ...
最新文章
- VOC2012 分割数据 转 lmdb 格式 python 代码
- DeepMind提出强化学习新算法,教智能体从零学控制
- 给QTreeWidget添加右键菜单功能
- a Line Segment Detector
- 按键映射_第三章 中文注释及按键相关
- 包包各部位名称图解_品尝烤肉必备!日本和牛各部位名称中日翻译对照 点餐更轻松...
- 如何将c语言程序封装供python调用_C++调用python
- python获取网页图片_Python获取网页上图片下载地址的方法
- 使用Kotlin在活动之间进行Android意向处理
- kaggle:Costa Rican Household Poverty Level Prediction(2):Base line
- 常用颜色的RGB值及中英文名称
- bzoj 2959: 长跑 lct+并查集
- PhD Debate-11 预告 | 回顾与展望神经网络的后门攻击与防御
- 200 OK(from memory cache)和 200 OK(from disk cache)
- 揭秘腾讯代码管理核心—工蜂Git系统架构
- 一个简单又诡异的互联网变现思维(抖音赚钱)
- python格式和JSON格式转换
- D - Six Degrees of Cowvin Bacon(最小路径)
- 服务器虚拟化技术主要有什么优势
- Qt 周立功can二次开发
热门文章
- http请求 url 竖线_http.createServer创建http服务
- 合并两个有序数组 java_合并两个有序的数组
- 未定义变量: data_三、变量声明
- linux看java堆大小,linux 改java堆内存大小
- python库迁移到没有网的电脑_python实现数据库跨服务器迁移
- 只能获取fixed语句初始值_因用了Insert into select语句,美女同事被开除了!
- java list stream avg_Java 8 Stream API中的多个聚合函数
- js 用下标获取map值_javascript怎么获取map的值?
- 计算机组成原理与应用,计算机组成原理简答与应用
- mongodb 导入 mysql_将mongodb 数据指定字段导出,然后指定字段导入mysql 实例 及相关问题解决...