UVA1625 颜色的长度/小车的颜色 题解
Tag:动态规划
题目描述
输入两个长度分别是
例如,两个颜色序列 GBBY
和 YRRGB
,至少有两种合并结果:GBYBRYRGB
和 YRRGGBBYB
。对于每种颜色来说其跨度
Color | G | Y | B | R | -> | Sum |
---|---|---|---|---|---|---|
GBYBRYRGB |
7 | 3 | 7 | 2 | -> | 19 |
YRRGGBBYB |
1 | 7 | 3 | 1 | -> | 12 |
你的任务是找一种合并方式,使得所有
思路
我们定义
那转移就可以分两种情况讨论:
1.把 移到前 个颜色的后面。(即从 转移过来)
因为
-
前面有同色且后面没有
。 -
前面没有同色且后面有
。 -
前后都无同色或都有
。
2.把 移到前 个颜色的后面。(即从 转移过来)
同理可得。
具体细节见代码。
#include<bits/stdc++.h>
#define PII pair<int,int>
#define ll long long
using namespace std;
const int N=5005;
int t,n,m;
string a,b;
bool qa[N][26],ha[N][26];
bool qb[N][26],hb[N][26];
int dp[N][N];
int main() {
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>t;
while(t--) {
cin>>a>>b;
n=a.size();
m=b.size();
a=" "+a;
b=" "+b;
memset(qa,0,sizeof(qa));
memset(ha,0,sizeof(ha));
memset(qb,0,sizeof(qb));
memset(hb,0,sizeof(hb));
for(int i=1; i<=n; i++) {
for(int j=0; j<='Z'-'A'; j++) {
qa[i][j]=qa[i-1][j]||(a[i]==char(j+'A'));
}
}
for(int i=1; i<=m; i++) {
for(int j=0; j<='Z'-'A'; j++) {
qb[i][j]=qb[i-1][j]||(b[i]==char(j+'A'));
}
}
for(int i=n; i>=0; i--) {//注意后缀要赋值到0
for(int j=0; j<='Z'-'A'; j++) {
ha[i][j]=ha[i+1][j]||(a[i]==char(j+'A'));
}
}
for(int i=m; i>=0; i--) {//注意后缀要赋值到0
for(int j=0; j<='Z'-'A'; j++) {
hb[i][j]=hb[i+1][j]||(b[i]==char(j+'A'));
}
}
memset(dp,0x3f,sizeof dp);
dp[0][0]=0;
for(int i=0; i<=n; i++) {//从0开始
for(int j=0; j<=m; j++) {//从0开始
if(i!=0) {
bool q=qa[i-1][a[i]-'A']||qb[j][a[i]-'A'];
bool h=ha[i+1][a[i]-'A']||hb[j+1][a[i]-'A'];
if(!q&&h) dp[i][j]=min(dp[i][j],dp[i-1][j]-i-j);
else if(q&&!h) dp[i][j]=min(dp[i][j],dp[i-1][j]+i+j);
else dp[i][j]=min(dp[i][j],dp[i-1][j]);
}
if(j!=0)
{
bool q=qa[i][b[j]-'A']||qb[j-1][b[j]-'A'];
bool h=ha[i+1][b[j]-'A']||hb[j+1][b[j]-'A'];
if(!q&&h) dp[i][j]=min(dp[i][j],dp[i][j-1]-i-j);
else if(q&&!h) dp[i][j]=min(dp[i][j],dp[i][j-1]+i+j);
else dp[i][j]=min(dp[i][j],dp[i][j-1]);
}
}
}
cout<<dp[n][m]<<"\n";
}
return 0;
}
本文作者:yaaaaaan
本文链接:https://www.cnblogs.com/yaaaaaan/p/18729879
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步