题目
[AtCoder ARC058C] 和風いろはちゃん / Iroha and Haiku
分析
显然只用存末尾的一段和小于等于 17 17 17 的状态,先深搜一波。
#include <algorithm>
#include <cstdio>
#include <cstring>
int tot;
void Dfs(int sum) {
if (sum > 17)
return;
tot++;
for (int i = 1; i <= 10; i++)
Dfs(sum + i);
}
int main() {
Dfs(0);
printf("%d", tot);
return 0;
}

仅有 1 0 5 10^5 105 种状态!于是 Hash 即可。可以预处理出数组 Next[i][j] 表示在第 i i i 种状态后面加一个数 j ( 1 ≤ j ≤ 10 ) j\ (1 \leq j \leq 10) j (1≤j≤10) 转移到的状态编号,注意要通过pop_front 之类的操作保证状态里面所有数之和小于等于 X + Y + Z X+Y+Z X+Y+Z。
然后状压 DP, d p [ i ] [ j ] [ 0 / 1 ] dp[i][j][0 / 1] dp[i][j][0/1] 表示前 i i i 个位置,状态的编号为 j j

最低0.47元/天 解锁文章
661

被折叠的 条评论
为什么被折叠?



