letter怎么读,letter纸张尺寸大小
标题:看这里。
含义:给两个只包含小写字母的字符串S和T。S和T的字母相同,但字母顺序可能不同。每一个运算都可以把s中的任意一个字母移动到s的开头或结尾,找到最小的操作数把s变成t,n=1000。
分析:以下问题解决方案描述了来自Wannafly的日常问题解决方案:
首先,我们得出一个简单的结论,就是每个角色最多移动一次。如果需要移动两次,可以通过改变移动顺序来减少移动次数。基于这个结论,我们把题目翻译成至少几个需要移动的字符。那么,我们倒过来想一想,把题目换成最多能固定多少个字符?
通过观察我们发现,假设我们选择了一些要固定的字符,由于操作是把字符放在原字符串的两端,固定的字符最终会按照原顺序合并在一起。
这样我们就得到这个问题的思路,就是求S和T的最长匹配,需要S中的子序列和T中的子串,只要稍微修改一下LCS的DP方程,时间复杂度为O (n 2)
代码如下:
//
//由BLUEBUFF 2016/1/11创建
//版权所有(c) 2016 BLUEBUFF。版权所有
//
#pragma注释(链接器,/STACK:102400000,102400000 )
//#包含ext/pb_ds/assoc_container.hpp
//#包含ext/pb_ds/tree_policy.hpp
//#包含ext/pb_ds/hash_policy.hpp
#包含集
#包含地图
#包括队列
#包括堆栈
#包含cmath
#包括cstdio
#包含时间. h
#包含cstdlib
#包括cstring
#包含复杂
# include sstream//is stringstream
#包括iostream
#包含算法
使用命名空间std
//使用命名空间_ _ gnu _ pbds
typedef long long LL
typedef无符号long long uLL
typedef对int,LL
#定义REP1(i,a,b)for(int I=a;我我)
#定义REP2(i,a,b)for(int I=a;我我)
#定义REP3(i,a,b)for(int I=a;我我-)
#定义CLR(a,b) memset(a,b,sizeof(a))
#定义MP(x,y) make_pair(x,y)
模板类T1,类T2内联void getmax(T1 a,T2 b){ if(b a)a=b;}
模板类T1,类T2内联void getmin(T1 a,T2 b){ if(b a)a=b;}
const int maxn=1024
const int maxm=1e5 5
const int maxs=10
const int maxp=1e3 10
const int INF=1e9
const int UNF=-1e 9;
const int mod=1e 9 7;
const int rev=(mod 1)1;//FWT
//const double PI=acos(-1);
//头
char s1[1005],S2[1005];
int DP[1005][1005];
int main(){
获取(S11);
获取(S2 ^ 1);
int ans=0;
int n=strlen(S1 1);
for(int I=1;i i ){
for(int j=1;j j ){
DP[I][j]=DP[I][j-1];
if(s1[j]!=s2[i])继续;
getmax(dp[i][j],DP[I-1][j-1]1);
getmax(ans,DP[I][j]);
}
}
cout n-ans endl;
}
转载请联系作者授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。