USACO 5.4 章节
Canada Tour
题目大意
双向连通图,点从左向右排列,
你需要先从最左的点到最右的点,(过程中只能从左向右走)
然后再从最右的点返回最左的点,(过程中只能从右向左走)
过程中除了最左的点,其它点都至多能经过一次
求最多能经过的点的个数
题解
从右向左走反过来,就是说从左向右走,题目变成从最左两条不相交到达最右的路径,经过最多的点
一个问题是如何解决没有重复的点
这里的解决方案是
dp[i][j]
表示没有重复的点的情况下 一条路径走到点i,一条路径走到点j,经过的点的最大的个数
在状态转移的时候需要保证新的状态有i<j
,
dp[i][j] = dp[i][k]+1
,如果k->j
有路径, 我们保证了除了初始点dp[0][0]=1
以外,任何i不等于0,有dp[i][i] = 0
,
证明一下
首先任何可达的状态不会遗漏,假设存在路径 一边到i,一边到j,(不妨设i<j
)那么有它的来源一定能从[i][k]
来
再不重复点证明
抛开初始点
因为保证了i<j
,dp[i][j]
的来源仅为dp[i][k]
,我们有k一定不等于i,所以只要dp[i][k]
是没有重复点的即可
因此递归可证明,这样的dp是不会经过重复点,
最后考虑都到达最右的点,那么发现和dp[i][最右]
的 经过的点数一致,注意的是 注意判断点i到最右点是否有路径
1 |
|
Character Recognition
题目大意
先提供空格和26个小写字母的 字符画01矩阵,每个字符都是20*20
然后 你需要解析一段n*20
字符矩阵,n行20列
这段矩阵和标准的差异是,
- 对于一个字符,可能某一行被倍增了 变成21行,它紧接着倍增那行
- 对于一个字符,可能某一行被吞了 变成19行
- 0 和 1 和真实值不同
上面问题可以存在的组合有,和原始完全一致,单纯1,单纯2,1+3,2+3,其中 0和1 的改变率小于等于30%
题目呢,可以说相当于 USACO帮我们建了个OCR的模型!!!我们在该模型下实现算法
题解
f[i]表示从最开始到第i行最小误差
f[i] = min(f[i-19]+19行来匹配,f[i-20]+20行来匹配,f[i-21]+21行来匹配)
我们预先处理 所有字符的行(27*20
) 和 目标匹配的行N
O(N*27*20)
然后 直接dp,O(N*(20*3))
理论上如果做了前缀和后缀和优化
实现如下
1 |
|
Telecowmunication
题目大意
100点,无向图
网络流,最小字典序的最小割点
记得前不久才有一个USACO的 最大流问题
题解
老生常谈了,=。=难道是我练题的顺序不对,感觉在刚刚学完最大流 最小割的时候,就会学到拆点啊。
然后直接最小割点就出来了,然后字典序就依次枚举 再计算?想了想编码似乎不可行 1 + 100
vs 2+3
若都是可行的,显然前面的字典序小
1 |
|
总结
第一题的DP的方法,我要是打cf没遇到,估计是想不出怎么处理路径不重复点 的 这样的状态转移
第二题的DP实现没啥好说的,但这样一个OCR模型 感觉也是很“实际”
第三题 emmmm 感觉刚学完网络流的时候 就知道拆点,好像没什么特别的。