(以“分类:划分动态规划 ==摘要== {{信息题|统计单词个数|http://www.codevs.cn/problem/1040/|1|100|算法错误|60|time=2015-2-3 17:32:11}} ==题意== ...”为内容创建页面) |
小 (→统计: 排版) |
||
第15行: | 第15行: | ||
}; | }; | ||
<small>最初想法是采用前缀数组来计算,但是会遗漏某些重叠等情况,特别是某些单词是其它单词前缀的情况(直接去除较短了好像由于数据原因能A但是明显有反例)。误入歧途了很多次。</small> | <small>最初想法是采用前缀数组来计算,但是会遗漏某些重叠等情况,特别是某些单词是其它单词前缀的情况(直接去除较短了好像由于数据原因能A但是明显有反例)。误入歧途了很多次。</small> | ||
− | + | ===划分=== | |
第二个小问题是求解。记f[i][k]为索引0~i处划分k次取得的最优解。枚举划分点,容易得到方程 | 第二个小问题是求解。记f[i][k]为索引0~i处划分k次取得的最优解。枚举划分点,容易得到方程 | ||
f[i][k]=max{f[j][k-1]+Count[j+1][i]}; | f[i][k]=max{f[j][k-1]+Count[j+1][i]}; | ||
(实际可以再省去一维空间,但是数据量较小,而且便于理解保留k维度) | (实际可以再省去一维空间,但是数据量较小,而且便于理解保留k维度) | ||
+ | |||
==代码== | ==代码== | ||
{{折叠|1040.cpp代码已折叠 | {{折叠|1040.cpp代码已折叠 |
题目链接 | 难度等级 | 完成状态 | 完成分数 | 最后编辑时间 | 失误原因(初次提交分数) |
---|---|---|---|---|---|
统计单词个数 | ★☆☆☆☆ | 答案正确 | 100 | 2015-2-3 17:32:11 | 算法错误(60) |
将字母串分成k份,每份中包含的单词个数加起来总数最大(单词可以部分重叠,第一个字母位置不能再用)
第一个小问题是如何求出第j~i位包含的单词总数,记作Count[j][i]。容易得到方程
- Count[j][i]=max
- {
- Count[j][i-1]+1 //如果以索引i结束的有一个单词//
- Count[j][i-1] //如果没有//
- };
最初想法是采用前缀数组来计算,但是会遗漏某些重叠等情况,特别是某些单词是其它单词前缀的情况(直接去除较短了好像由于数据原因能A但是明显有反例)。误入歧途了很多次。
第二个小问题是求解。记f[i][k]为索引0~i处划分k次取得的最优解。枚举划分点,容易得到方程
- f[i][k]=max{f[j][k-1]+Count[j+1][i]};
(实际可以再省去一维空间,但是数据量较小,而且便于理解保留k维度)
1040.cpp代码已折叠
展开折叠内容
|
---|
显示/移除行号
|