Codeforces Round #174 (Div. 1)
比赛地址
A:直接贴了个模板,我有罪。。。。
B:dp[i][2],表示从i出发的结果(要么走到挂,要么循环),记忆化搜索就好了,每次要注意判环
C:问你有多少种组合满足Q个条件,每个条件的形式是硬币a出现的次数 大于 硬币b出现的次数 ,先类似于传递闭包搞一下,判掉自己大于自己的情况,然后再用背包来做,每次放进来一个硬币就相当于把出现次数比这个硬币多的硬币都放进来了,由此知道了物品的体积,这是关键所在吧。
} } for(int j = sum[i]; j <= t; j++) { dp[j] += dp[j-sum[i]]; dp[j] %= mod; } } printf("%d\n",dp[t]); return 0;}D : 题意:如果x 能表示成连续的y个数之和,那么x 和y就是cool的,现在给你一个最长为5000的序列,问你最少改变几个数字使得整串序列是cool的,整串序列是cool的当且仅当每两个相邻的数是cool的。
5000的范围暗示了是个5000*5000的dp,所以我们只需要解决这样一个问题,给你ai aj,判断这两个数能否成为一个cool序列的头和尾,序列长度为j-i+1.
写了一个证明,英文不好不要吐槽E