1079: [SCOI2008]着色方案 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id=1079 Description 有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i种颜色的油漆足够涂ci个木块.所有油漆刚好足够涂满所有木块,即c1+c2+...+ck=n.相邻两个木块涂相同色显得很难看,所以你希望统计任意两个相邻木块颜色不同的…
有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i 种颜色的油漆足够涂ci 个木块.所有油漆刚好足够涂满所有木块,即 c1+c2+...+ck=n.相邻两个木块涂相同色显得很难看,所以你希望统计任意两个相邻木块颜色不同的着色方案. Solution 有一个非常好的条件就是c[i]<=5,这样我们就可以设计状态为dp[1][2][3][4][5][la]表示有一个的有几种颜色,有两个的有几种颜色·····,上一次我们枚举的是哪里. 然后就愉快的记忆化搜索,注意要求相邻木块颜…
题意:有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i种颜色的油漆足够涂ci个木块. 所有油漆刚好足够涂满所有木块,即c1+c2+...+ck=n.相邻两个木块涂相同色显得很难看,所以你希望统计任意两 个相邻木块颜色不同的着色方案. 题解:写爆搜妥妥的tle 但是看一眼dp数组应该就秒懂了... 还能涂一个的颜色有几种 还能涂两个的颜色剩几种.... 就是一个ez的记忆化搜索了 总结:感觉这道题还是挺套路的 直接爆搜是不行的 但是发现有许多状态其实是一样的 比如当前还剩…
1079: [SCOI2008]着色方案 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 803  Solved: 512[Submit][Status] Description 有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i种颜色的油漆足够涂ci个木块.所有油漆刚好足够涂满所有木块,即c1+c2+...+ck=n.相邻两个木块涂相同色显得很难看,所以你希望统计任意两个相邻木块颜色不同的着色方案. Input 第一行为一…
题目传送门 题目大意: 有k种颜色,每个颜色ci可以涂个格子,要求相邻格子颜色不能一样,求方案数.ci<=5,k<=15. 思路: 题目里最重要的限制条件是相邻格子颜色不能相同,也就是当前格子只和上一个格子有关,那么对于还剩相同个数的颜色,如果都和上一个颜色不一样的话,那么这几种颜色都是一样的.如果某一种颜色和上一个颜色一样,那这个不算就可以了. 所以f[a][b][c][d][e][last]表示,还剩1次的颜色有a个,2两次颜色有b个,3次的颜色有c个,4次的颜色d个,5次的颜色e个,上一…
本来打算把每个颜色剩下的压起来存map来记忆化,写一半发现自己zz了 考虑当前都能涂x次的油漆本质是一样的. 直接存五个变量分别是剩下12345个格子的油漆数,然后直接开数组把这个和步数存起来,记忆化dfs即可 #include<iostream> #include<cstdio> using namespace std; const int N=17,mod=1e9+7; int n,a[7]; long long f[N][N][N][N][N][7]; bool v[N][N…
BZOJ 1079: [SCOI2008]着色方案(巧妙的dp) 题意:有\(n\)个木块排成一行,从左到右依次编号为\(1\)~\(n\).你有\(k\)种颜色的油漆,其中第\(i\)种颜色的油漆足够涂\(c_i\)个木块.所有油漆刚好足够涂满所有木块,即\(\sum\limits _{i=1}^{k}c_i=n\).统计任意两个相邻木块颜色不同的着色方案.(\(1 \le k \le 15\) ,\(1\le c_i \le 5\)) 题解:特别巧妙的dp!一开始容易想到用\({c_i}^k…
http://www.lydsy.com/JudgeOnline/problem.php?id=1079 思路:如果把每种油漆看成一种状态,O(5^15)不行 DP[a][b][c][d][e][f]:a表示能凃一个的有多少个 b能凃2个的还有多少个 c能凃3个的还有多少个 d能凃4个的还有多少个 e能凃5个的还有多少个 last 上次凃的是:last个油漆. 所以这次如果选last-1个油漆的时候,数量还要减一,与上次不同 //#pragma comment(linker, "/STACK:1…
题目链接:BZOJ - 1068 题目分析 这种记忆化搜索(区间 DP) 之前就做过类似的,也是字符串压缩问题,不过这道题稍微复杂一些. 需要注意如果某一段是 S1S1 重复,那么可以变成 M + Solve(S1) + R ,不过这个 Solve(S1) 中不能在中间有 M ,否则后面的 R 向前找到的 M 就不再是开头的 M 了. 代码 #include <iostream> #include <cstdio> #include <cstring> #include…
http://www.lydsy.com/JudgeOnline/problem.php?id=1079 只能想到5^15的做法...........................果然我太弱. 其实应该是没利用好题目的信息,ci<=5! 那么我们可以将颜色所剩余的格子看做一种等价类! 即,设状态f[a,b,c,d,e]表示还剩1个格子的颜色有a种,剩2个格子的颜色有b种...依次类推,且当前正在放第n-1*a-2*b-3*c-4*d-5*e+1格子.那么转移就是 f[a,b,c,d,e]=a*…