一个长条有M个格子,用n种颜色去图,每种颜色有k[i]个, 一共正好m个! 正好涂满M个格子,要求是相邻的格子颜色不能相同!
这类题可以看做一类组合DP问题,当初的想法挺简单就是这一个格子放那种颜色,得看他前面那种格子放什么颜色,这就用到了转移,就是DP! 这个题本来是省赛的E题有点相似,但又有不同,那个题没有数量这一个条件,而这里有需要使用数量限制,但是实际操作过程中,数量限制很难记录,或者说根本就没法记录! 因为这一个格子,你放置了某种颜色,但是这种颜色是从前面某种颜色中转化过来的,由那种颜色转化过来就导致了消耗的不确定性! 难以记录,而这个题用穷举的思路也想然不行,因为题目数据量显然不能用这个办法! 怎么办额?! 好像有更简单的算法…… 借鉴 doma的指点,这个题的原型是腾讯马拉松的一个题:http://acm.hdu.edu.cn/showproblem.php?pid=4532 貌似URAL也有类似的题,到现在我好想还在纠结着用哪个错误的思路在敲呢!
下面是我三for前套的错误代码:
for(int i=1; i<m; ++i)
{
for(int j=1; j<=n; ++j)
{
for(int h=1; h<=n; ++h)
{
if(j!=h&&cnt[i][j]<k[j])
{
dp[i][j]+=dp[i-1][h];
cnt[i-1][h]++;
}
}
}
}