华师一附中OI组
标题:
P1435 回文字串
[打印本页]
作者:
倚窗倾听风吹雨
时间:
2018-7-15 09:00
标题:
P1435 回文字串
https://www.luogu.org/problemnew/show/P1435
题目背景
IOI2000第一题
题目描述
回文词是一种对称的字符串。任意给定一个字符串,通过插入若干字符,都可以变成回文词。此题的任务是,求出将给定字符串变成回文词所需要插入的最少字符数。
比如 “Ab3bd”插入2个字符后可以变成回文词“dAb3bAd”或“Adb3bdA”,但是插入少于2个的字符无法变成回文词。
注:此问题区分大小写
输入输出格式
输入格式:
一个字符串(0<strlen<=1000)
输出格式:
有且只有一个整数,即最少插入字符数
输入输出样例
输入样例#1:
Ab3bd
输出样例#1:
2
作者:
倚窗倾听风吹雨
时间:
2018-7-15 09:00
#include<iostream>
#include<cstdio>
using namespace std;
int i,j,n,f[2000][2000],ans;
char c1[2000],c2[2000];
int main()
{
while(scanf("%s",c1)!=EOF)continue;
while(c1[n++]!=0)continue;
n--;
for(i=0;i<n;i++)
c2[i]=c1[n-i-1];
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(c1[i-1]==c2[j-1])f[i][j]=f[i-1][j-1]+1;
else f[i][j]=max(f[i-1][j],f[i][j-1]);
/// cout<<i<<" "<<j<<" "<<f[i][j]<<endl;
}
}
/*for(i=0;i<n;i++)cout<<c2[i];
cout<<endl<<n<<endl;
cout<<f[n][n];*/
ans=n-f[n][n];
cout<<ans;
return 0;
}
复制代码
作者:
walk_alone
时间:
2018-7-27 21:45
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int f[1001][1001];
int main()
{
char a[2001],b[2001];
scanf("%s",a+1);
int len=strlen(a+1);
for(int i=1;i<=len;i++)
b[len-i+1]=a[i];
for(int i=1;i<=len;i++)
for(int j=1;j<=len;j++)
if(a[i]==b[j])
f[i][j]=f[i-1][j-1]+1;
else
f[i][j]=max(f[i][j-1],f[i-1][j]);
printf("%d",len-f[len][len]);
return 0;
}
复制代码
作者:
黄煦喆
时间:
2018-7-28 16:18
#include<iostream>
#include<algorithm>
using namespace std;
string s1;
int a[1001][1001];
int main()
{
cin>>s1;
int len=s1.size();
string s2=s1;
reverse(s2.begin(),s2.end());
s1=' '+s1;s2=' '+s2;
for(int i=1;i<=len;i++)
for(int j=1;j<=len;j++)
if(s1[i]==s2[j])a[i][j]=a[i-1][j-1]+1;
else a[i][j]=max(a[i-1][j],a[i][j-1]);
cout<<len-a[len][len];
return 0;
}
复制代码
作者:
张笑宇
时间:
2018-7-28 17:06
#include<iostream>
using namespace std;
string s1,s2;
int l,i,j;
const int mx=1010;
int dp[mx][mx];
int main()
{
cin>>s1;
l=s1.size(),s2="";
for (i=0;i<=l-1;i++) s2=s1[i]+s2;
for (i=0;i<=l-1;i++)
for (j=0;j<=l-1;j++) dp[i][j]=0;
for (i=1;i<=l;i++)
for (j=1;j<=l;j++)
{
if (s1[i-1]==s2[j-1]) dp[i][j]=dp[i-1][j-1]+1;
else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
///cout<<dp[i][j]<<" "<<i<<" "<<j<<endl;
}
///cout<<s1<<endl<<s2<<endl;
cout<<l-dp[l][l];
return 0;
}
复制代码
作者:
张笑宇
时间:
2018-7-28 17:07
最长公共子序列
+
反转字串
作者:
ZMQ
时间:
2018-8-4 22:11
提示:
作者被禁止或删除 内容自动屏蔽
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2