题目大意:

给你两个字符串p,q,字符串中每个字符代表一个颜色,现在按顺序合并两个字符串,得到一个新字符串。新字符串的价值为,每个颜色价值的和,单个颜色价值的和等于该颜色在新字符中最后一次出现的位置减去第一次出现的位置。求最小价值

题目思路:

dp[i][j]代表使用p的前i个字符,q的前j个字符合并产生的价值。对于dp[i][j],可由dp[i-1][j],dp[i][j-1]转移得到,每次转移增加的价值为【已被填入,但尚未填完的颜色的个数】。

用c[][]维护当前已被填入但尚未被填完的颜色的数目,若一个颜色新加入就加一,若一个颜色被填完就减一。

由于dp[5000][5000]太大了,且每次转移仅与dp[i-1][j],dp[i][j-1]有关,我们可以采用滚动数组优化

#pragma GCC optimize(2)
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<stdlib.h>
#include<iostream>
#include<stack>
#include<vector>
#include<math.h>
using namespace std;
#define LL long long
#define INF 0x3f3f3f3f int dp[][];
int c[][];
char s1[],s2[];
struct node
{
int s,e;
} p1[],p2[]; int main()
{
int n;
scanf("%d",&n);
//cout << (int) 'Y'-'A' << endl;
while(n--)
{
for(int i=; i<; i++)
{
p1[i].s = p2[i].s = INF;
p1[i].e = p2[i].e = -;
}
scanf("%s",s1+);
scanf("%s",s2+);
int l1 = strlen(s1+);
int l2 = strlen(s2+);
for(int i=; i<=l1; i++)
{
int id = s1[i] - 'A';
if(p1[id].s == INF)
p1[id].s = i;
p1[id].e = i;
}
for(int i=; i<=l2; i++)
{
int id = s2[i] - 'A';
if(p2[id].s == INF)
p2[id].s = i;
p2[id].e = i;
}
int t = ;
memset(c,,sizeof(c));
memset(dp,,sizeof(dp));
for(int i=; i<=l1; i++)
{
for(int j=; j<=l2; j++)
{
if(!i && !j)
continue;
int v1=INF,v2=INF;
if(i)
v1 = dp[t^][j] + c[t^][j];
if(j)
v2 = dp[t][j-] + c[t][j-];
dp[t][j] = min(v1,v2); if(i)
{
c[t][j] = c[t^][j];
if(p1[s1[i]-'A'].s == i && p2[s1[i]-'A'].s>j)
c[t][j]++;
if(p1[s1[i]-'A'].e == i && p2[s1[i]-'A'].e <= j)
c[t][j]--;
}
if(j)
{
c[t][j] = c[t][j-];
if(p2[s2[j]-'A'].s == j && p1[s2[j]-'A'].s>i)
c[t][j]++;
if(p2[s2[j]-'A'].e == j && p1[s2[j]-'A'].e <= i)
c[t][j]--;
}
}
t ^= ;
}
printf("%d\n",dp[t^][l2]);
}
return ;
}

最新文章

  1. 跨语言和跨编译器的那些坑(CPython vs IronPython)
  2. ELK日志管理之——kibana部署
  3. 打开android虚拟机时出现a repairable android virtual device
  4. jquery 点击页面其他地方实现隐藏菜单功能
  5. 转帖:使用TortoiseGit处理代码冲突
  6. codeforces 681D Gifts by the List dfs+构造
  7. String.IndexOf String.IndexOf String.Substring
  8. poj 3694 Network(双连通分量)
  9. 包含中文字符的NSString 转换为NSURL
  10. iOS之加载Gif图片
  11. Oracle11g温习-第十七章:权限管理
  12. 控制台输出到txt
  13. Sequelize-nodejs-12-Migrations
  14. linux 用时间创建文件夹
  15. 【LGP5108】仰望半月的夜空
  16. .NET破解之爱奇迪(三)
  17. VMware安装完后,没有虚拟网卡
  18. Array对象(一)
  19. 【docker】kubernetes集群一键部署包
  20. ASP.NET Cookie的登录验证

热门文章

  1. c# 代码调用ssis包
  2. 具有避障和寻线功能的Arduino小车
  3. c#指定程序运行指定文件(太好了,终于找到了)
  4. hadoop启动脚本分析及常见命令
  5. 关于大数据领域各个组件打包部署到集群运行的总结(含手动和maven)(博主推荐)
  6. 【转】Sublime Text2中的快捷键一览表(Sublime 键盘快捷键大全 )
  7. HDU 5242 树链剖分思想的贪心
  8. Ros学习——Python发布器publisher和订阅器subscriber
  9. OpenCV Mat数据类型指针ptr的使用
  10. bzoj4391 [Usaco2015 dec]High Card Low Card