gryz第一大颓子的训练实录
5.14
CH0101
使用std做法完成这道题
solution:快速幂
二进制的一个应用
CH0102
使用二进制做法完成这道题
solution:O1快速乘
get到了O1快速乘这一个技能
O1快速乘巧妙利用了计算机处理数据的性质
CH0103
使用std做法完成这道题
solution:
设\(f_{i,j}\)表示到达i点,凑成j这个局面的最小步数。
转移方程式:
\[f_{i,j} = min(f_{k,1 << i \hat j} + dis[k][i])\]
边界:
\[f_{0,1} = 0 , otherwise = inf\]
答案:
\[f_{n - 1,(1 <<n) - 1}\]
核心代码:
int Solve() {
memset(f , 0x3f, sizeof(f));
f[0][1] = 0;
for(int i = 0;i < n;++ i) {
for(int j = 1;j < (1 << n);++ j) {
if(j & (1 << i)) {
for(int k = 0;k < n;++ k) {
f[i][j] = min(f[i][j] , f[k][j ^ (1 << j)] + dis[k][i]);
}
}
}
}
return f[n - 1][1 << n - 1];
}
范围这么小,联想到使用状态压缩DP解决问题
5.15
CH0301
使用std做法完成这道题
注意递归时候,回溯到上一问题
CH0303
使用std做法完成这道题
CH0201
只会brute force
solution:类似的题目,枚举一部分,继而递推出全部答案。
发现有一个性质是,一个点最多被点击一次,那么我们可以\(2^5\),枚举第一行是否被点击过,然后开始递推。
这道题实际上是一道套路题。
POJ1958
brute force都不会
solution:哎,难题。
考虑朴素汉诺塔问题。
由朴素问题推广到难题,可以参考朴素问题的解法。
\(\sum_{i = 1}^n = \frac{n*(n +1)}{2}\)
5.16
颓了一上午,下午要滚回到教室学学科了。
CH0304
使用std做法完成这道题
考虑差分(人类智慧),然后讨论一下即可
对于区间的操作,模型很模糊的,可以用差分试一下。
POJ3263
把一个操作看成一个区间。
有性质:两个区间必定不会相交。
然后考虑一个点被几个区间覆盖即可。
把对一个区间的操作转化为左、右两个端点上的操作,通过前缀和得到问题的解。