题目连接:http://acm.pku.edu.cn/JudgeOnline/problem?id=1185
一看题只感觉是状态的压缩,因为数据为100*10,但是不知道何从下手,如何状态压缩。后来看了周伟(天津大学)的论文上面该题的讲解分析,然后参考了网上这个牛的blog http://longzxr.blog.sohu.com/111314565.html。写了下代码。发现位运算比较好,非常位运算了解太少呀。。。算法:状态压缩。
给出一个估算公式:运用简单的组合数学知识可以求出:在格数为 m的一行上放棋子且相邻两个棋子中间的空格不能少于d的num=g[m+d+1],其中g[i]=1 (i=1..d+1); g[j]=g[j-d-1]+g[j-1] (j>d)(摘自《状态压缩》周伟)。
有上式可知一行全为平原时,最多有60种放法,那么开始可以枚举所有的放法。
对于第i行,一共的放法有60种,那么第i-2,i-1行的放法同样有60种,那么枚举这3行即可。剪掉与该行山地有冲突的放法,剪掉这三行里面有冲突的放法。
状态方程:dp[i][j][k]=max{dp[i-1][k][l]+c[j]};
代码: