看题解解的。将着色方案映射为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相关推荐

  1. 【HDOJ】4602 Partition

    [题目]http://acm.hdu.edu.cn/showproblem.php?pid=4602 [报告] 直接贴上标程解题报告:(虽然有些纠结,试一下就弄通了..) Problem C. Par ...

  2. 【HDOJ】4602 Partition_天涯浪子_新浪博客

    [题目]http://acm.hdu.edu.cn/showproblem.php?pid=4602 [报告] 直接贴上标程解题报告:(虽然有些纠结,试一下就弄通了..) Problem C. Par ...

  3. 【HDOJ】1008 Elevator_天涯浪子_新浪博客

    [题目] http://acm.hdu.edu.cn/showproblem.php?pid=1008 [报告] 这是我在HDOJ里看到的最水的题目,至少目前为止. 题目里已经讲得很清楚了,模拟就能过 ...

  4. 【HDOJ】1022 Train Problem I_天涯浪子_新浪博客

    [题目]http://acm.hdu.edu.cn/showproblem.php?pid=1022 [报告] 模拟,直接模拟一个栈的运行就行了. [程序] // Task: 1022 Train P ...

  5. 【HDOJ】1003 Max Sum_天涯浪子_新浪博客

    [题目]http://acm.hdu.edu.cn/showproblem.php?pid=1003 [报告] 既然是子区间加和问题,可以用减法来处理.比如求[5..10]的和,可以直接用[1..10 ...

  6. 【HDOJ】4768 Flyer_天涯浪子_新浪博客

    [题目]http://acm.hdu.edu.cn/showproblem.php?pid=4768 [报告] 题目中已经说了,保证最多出现一个奇数,所以可以用异或的想法.把所有的数异或起来,如果最后 ...

  7. 【HDOJ】4699 Editor_天涯浪子_新浪博客

    [题目] http://acm.hdu.edu.cn/showproblem.php?pid=4699 [报告] 模拟题吧,本身不是很难. 最初的想法是用Splay tree写,然后疯掉了.苏牛说2B ...

  8. 【HDOJ】4704 Sum_天涯浪子_新浪博客

    [题目] http://acm.hdu.edu.cn/showproblem.php?pid=4704 [报告] S(K)显然就是N的K正整数划分数.所以SUM{S(K),1<=K<=N} ...

  9. 【HDOJ】1015 Safecracker_天涯浪子_新浪博客

    [题目]http://acm.hdu.edu.cn/showproblem.php?pid=1015 [报告] 题目写的很长,忽略一系列废话,题意就是求一个方程v - w^2 + x^3 - y^4 ...

最新文章

  1. VOC2012 分割数据 转 lmdb 格式 python 代码
  2. DeepMind提出强化学习新算法,教智能体从零学控制
  3. 给QTreeWidget添加右键菜单功能
  4. a Line Segment Detector
  5. 按键映射_第三章 中文注释及按键相关
  6. 包包各部位名称图解_品尝烤肉必备!日本和牛各部位名称中日翻译对照 点餐更轻松...
  7. 如何将c语言程序封装供python调用_C++调用python
  8. python获取网页图片_Python获取网页上图片下载地址的方法
  9. 使用Kotlin在活动之间进行Android意向处理
  10. kaggle:Costa Rican Household Poverty Level Prediction(2):Base line
  11. 常用颜色的RGB值及中英文名称
  12. bzoj 2959: 长跑 lct+并查集
  13. PhD Debate-11 预告 | 回顾与展望神经网络的后门攻击与防御
  14. 200 OK(from memory cache)和 200 OK(from disk cache)
  15. 揭秘腾讯代码管理核心—工蜂Git系统架构
  16. 一个简单又诡异的互联网变现思维(抖音赚钱)
  17. python格式和JSON格式转换
  18. D - Six Degrees of Cowvin Bacon(最小路径)
  19. 服务器虚拟化技术主要有什么优势
  20. Qt 周立功can二次开发

热门文章

  1. http请求 url 竖线_http.createServer创建http服务
  2. 合并两个有序数组 java_合并两个有序的数组
  3. 未定义变量: data_三、变量声明
  4. linux看java堆大小,linux 改java堆内存大小
  5. python库迁移到没有网的电脑_python实现数据库跨服务器迁移
  6. 只能获取fixed语句初始值_因用了Insert into select语句,美女同事被开除了!
  7. java list stream avg_Java 8 Stream API中的多个聚合函数
  8. js 用下标获取map值_javascript怎么获取map的值?
  9. 计算机组成原理与应用,计算机组成原理简答与应用
  10. mongodb 导入 mysql_将mongodb 数据指定字段导出,然后指定字段导入mysql 实例 及相关问题解决...