题目:题目链接

题意:输入两个长度分别为n和m的颜色序列,要求按顺序合并成同一个序列,即每次可以把一个序列开头的颜色放到新序列的尾部。对于每个颜色c来说,其跨度L(c)等于最大位置和最小位置之差,输出各颜色跨度之和。

思路:设d(i, j)表示两个序列分别移走了i和j个元素,还需要多少费用。每移一次,我们需要对已经出现但没有结束的颜色跨度加一,用数组c表示已经开始但没有结束的颜色数量,我们得到状态转移方程:dp(i,j)=min(dp(i-1,j)+c[i-1][j],dp(i,j-1)+c[i][j-1])

AC代码:

 #include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <string>
#include <map>
#include <set>
#include <unordered_map>
#include <unordered_set>
#include <queue>
#include <stack>
#include <list> #define FRER() freopen("in.txt", "r", stdin)
#define FREW() freopen("out.txt", "w", stdout) #define INF 0x3f3f3f3f using namespace std; const int maxn = + ; char str[maxn], ptr[maxn]; int ss[], sp[], es[], ep[]; int d[maxn][maxn], c[maxn][maxn]; int main()
{
ios::sync_with_stdio();
cin.tie();
int T;
cin >> T;
while(T--) {
cin >> (str + ) >> (ptr + ); int n = strlen(str + ), m = strlen(ptr + ); memset(ss, INF, sizeof(ss));
memset(sp, INF, sizeof(sp));
memset(es, , sizeof(es));
memset(ep, , sizeof(ep)); for(int i = ; i <= n; ++i) {
ss[str[i] - 'A'] = min(ss[str[i] - 'A'], i);
es[str[i] - 'A'] = i;
}
for(int i = ; i <= m; ++i) {
sp[ptr[i] - 'A'] = min(sp[ptr[i] - 'A'], i);
ep[ptr[i] - 'A'] = i;
} for(int i = ; i <= n; ++i) {
for(int j = ; j <= m; ++j) {
if(!i && !j) continue;
int v1 = INF, v2 = INF;
if(i) v1 = d[i - ][j] + c[i - ][j];
if(j) v2 = d[i][j - ] + c[i][j - ];
d[i][j] = min(v1, v2); if(i) {
c[i][j] = c[i - ][j];
if(ss[str[i] - 'A'] == i && sp[str[i] - 'A'] > j) c[i][j]++;
if(es[str[i] - 'A'] == i && ep[str[i] - 'A'] <= j) c[i][j]--;
} else if(j) {
c[i][j] = c[i][j - ];
if(sp[ptr[j] - 'A'] == j && ss[ptr[j] - 'A'] > i) c[i][j]++;
if(ep[ptr[j] - 'A'] == j && es[ptr[j] - 'A'] <= i) c[i][j]--;
}
}
} cout << d[n][m] << endl;
}
return ;
}

最新文章

  1. Yii2中的零碎知识点
  2. 7.$a = &#39;abcdef&#39;; 请取出$a的值并打印出第一个字母
  3. 2016年发布APASVO-p波震相自动拾取分析
  4. javascript中数组的map方法
  5. VisualStudio使用小技巧——快捷键(转)
  6. Strange java.lang.ArrayIndexOutOfBoundsException thrown on jetty startup
  7. DataGridView控件的使用---添加行
  8. Javascript Utils.js
  9. CentOS系统cobbler完全部署及案例测试
  10. verilog中的有符号数运算
  11. Nyoj 天下第一(spfa)
  12. 对angularjs时间过滤格式
  13. paping使用来测试联通&amp;网站由于tcp协议导致的无法通信问题超时问题
  14. ROS:使用Qt Creator创建GUI程序(一)
  15. LoadRunner录制脚本时没有响应——无法启动浏览器问题总结
  16. 定时 清理 elasticsearch 6.5.4 的 索引 文件
  17. gentoo emacs 中文输入法 呼出
  18. raindi python魔法函数(一)之__repr__与__str__
  19. git的reset的理解
  20. VS Code行内样式提示插件

热门文章

  1. Android 开发知识结构图
  2. wamp环境初步使用
  3. 简单封装的web里面的tab点击和swipe滑动的小插件
  4. Android Support v4,v7,v13的区别和应用场景
  5. 今天 小小收获, 看了 sam Xiao 的好帖子 明白了 泛型委托 的 意思。
  6. 卷积神经网络CNN在自然语言处理的应用
  7. cudaMallocPitch – 向GPU分配存储器
  8. CTS、CLS、CLR分别作何解释?
  9. JavaWeb-拦截器,过滤器,监听器的区别和执行顺序
  10. view的superview的变换