日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

【Uva 1625】Color Length

發(fā)布時(shí)間:2025/7/14 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Uva 1625】Color Length 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Link:

Description

給你兩個(gè)序列,都由大寫(xiě)字母組成;
每次,把兩個(gè)序列中的一個(gè)的開(kāi)頭字母加在字符串的尾端,然后在那個(gè)序列中刪掉那個(gè)開(kāi)頭字母;
最后得到一個(gè)字符串;
這個(gè)字符串顯然后很多種;
讓你找所有字母的L(C)的和的最小值;
L(c)是某個(gè)字母在最后的那個(gè)字符串中出現(xiàn)的結(jié)尾位置和開(kāi)始位置的差值;

Solution

設(shè)f[i][j]表示第一個(gè)序列1..i全都移除掉了,第二個(gè)序列1..j全都移除掉了的最小L(c)和;
這里不能直接算出某個(gè)字母的L(C)值,但是能一步一步地累加,比如,你新加了一個(gè)字母x,然后在此之前,已有的字符串里面,有字母a,且還有未加入的字母a;
則L(a)的值可以肯定會(huì)遞增1了;
則可以寫(xiě)出轉(zhuǎn)移方程
f[i][j]=min(f[i][j],f[i?1][j]+cnt[i?1][j])
f[i][j]=min(f[i][j],f[i][j?1]+cnt[i][j?1]);
這里的cnt[i][j]表示第一個(gè)序列前i個(gè)字母移出去了,第二個(gè)序列前j個(gè)字母移出去了所形成的字符串,有多少個(gè)字母已經(jīng)出現(xiàn)了,但是還沒(méi)有全部出現(xiàn);
為了獲取這個(gè)cnt數(shù)組;
可以先獲取,每個(gè)字母在這兩個(gè)序列中第一次出現(xiàn)最后一次出現(xiàn)的位置;
然后對(duì)于枚舉的i和j;
看看每個(gè)字母是不是在這個(gè)情況下出現(xiàn)了;
這樣就能獲得cnt數(shù)組;

NumberOf WA

4

Reviw

用memset會(huì)莫名的TLE;
改成循環(huán)就過(guò)了

Code

#include <bits/stdc++.h> using namespace std; #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define LL long long #define rep1(i,a,b) for (int i = a;i <= b;i++) #define rep2(i,a,b) for (int i = a;i >= b;i--) #define mp make_pair #define pb push_back #define fi first #define se second #define ms(x,y) memset(x,y,sizeof x) #define Open() freopen("F:\\rush.txt","r",stdin) #define Close() ios::sync_with_stdio(0)typedef pair<int,int> pii; typedef pair<LL,LL> pll;const int dx[9] = {0,1,-1,0,0,-1,-1,1,1}; const int dy[9] = {0,0,0,-1,1,-1,1,-1,1}; const double pi = acos(-1.0); const int N = 5e3; const int INF = 0x3f3f3f3f;int dp[N+100][N+100],n,m,cnt[N+100][N+100]; pii a1[27],a2[27]; char s1[N+100],s2[N+100];int main(){//Open();//Close();int T;scanf("%d",&T);while (T--){scanf("%s",s1+1);scanf("%s",s2+1);n = strlen(s1+1),m = strlen(s2+1);rep1(i,1,26) a1[i].fi = a1[i].se = a2[i].fi = a2[i].se = 0;//第一次出現(xiàn)rep1(i,1,n){int t = s1[i]-'A'+1;if (a1[t].fi==0) a1[t].fi = i;}rep1(i,1,m){int t = s2[i]-'A'+1;if (a2[t].fi==0) a2[t].fi = i;}//最后一次出現(xiàn)rep2(i,n,1){int t = s1[i]-'A'+1;if (a1[t].se==0) a1[t].se = i;}rep2(i,m,1){int t = s2[i]-'A'+1;if (a2[t].se==0) a2[t].se = i;}rep1(i,0,n)rep1(j,0,m){int temp = 26;rep1(k,1,26){if (a1[k].fi == 0 && a2[k].fi==0){temp--;continue;}if (a1[k].fi!=0 && a2[k].se==0){if (i<a1[k].fi){temp--;continue;}if (a1[k].se<=i){temp--;continue;}}if (a1[k].fi==0 && a2[k].se!=0){if (j<a2[k].fi){temp--;continue;}if (a2[k].se<=j){temp--;continue;}}if (a1[k].fi!=0 && a2[k].fi!=0){if (i<a1[k].fi && j<a2[k].fi){temp--;continue;}if (a1[k].se<=i && a2[k].se<=j){temp--;continue;}}}cnt[i][j] = temp;}rep1(i,0,n)rep1(j,0,m)dp[i][j] = INF;dp[0][0] = 0;rep1(i,0,n)rep1(j,0,m){if (i-1 >= 0){dp[i][j] = min(dp[i][j],dp[i-1][j] + cnt[i-1][j]);}if (j-1 >= 0){dp[i][j] = min(dp[i][j],dp[i][j-1] + cnt[i][j-1]);}}cout << dp[n][m] << endl;}return 0; }

轉(zhuǎn)載于:https://www.cnblogs.com/AWCXV/p/7626202.html

總結(jié)

以上是生活随笔為你收集整理的【Uva 1625】Color Length的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。