社区讨论

三四十分求助

P1435[IOI 2000] 回文字串参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@m1iyasbz
此快照首次捕获于
2024/09/26 15:06
去年
此快照最后确认于
2025/11/04 18:46
4 个月前
查看原帖
我的思路是从中某个位置分别向前和向后取两个子串,然后找到最大公式子序列,分别剩下多少个就是需要插入的数据。 分两种情况讨论,补完是偶数个的字符串和补完是奇数个的,也就是当前位置这一个不是两个子串的或者是某个子串的。但是问题出现了,两个都考虑到是30分,正确的是1、5、10测试点。只考虑为偶数的是40分,正确的是1、7、8、10。只考虑为奇数的是30分,正确的是3、4、5 这就让人很费解了,求大佬指点
CPP
#include<bits/stdc++.h>
using namespace std;
int fun(string s,string t)
{
	int m,n,i,j;
	m=s.size();
	n=t.size();
	int a[m+1][n+1];
	for(i=0;i<=m;i++)
		a[i][0]=0;
	for(i=0;i<=n;i++)
		a[0][i]=0;
	for(i=1;i<=m;i++)
		for(j=1;j<=n;j++)
		{
			if(s[i]==t[j])
				a[i][j]=a[i-1][j-1]+1;
			else
				if(a[i-1][j]>a[i][j-1])
					a[i][j]=a[i-1][j];
				else
					a[i][j]=a[i][j-1];
		}
	//if(a[m][n]==143)
		//cout<<s<<endl<<t<<endl;
	return a[m][n];
}
int main()
{
	string s,t,w;
	cin>>s;
	int i,j,ans=0x7fffffff,x,y;
	y=s.size();
	for(i=0;s[i];i++)
	{
		t="";
		for(j=i-1;j>=0;j--)
			t+=s[j];
		w="";
		for(j=i+1;j<y;j++)
			w+=s[j];
		x=y-1-2*fun(t,w);
		if(x<ans)
			ans=x;
		t=s[i]+t;
		x=y-2*fun(t,w);
		if(x<ans)
			ans=x;
	}
	cout<<ans;
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...