교내 시뮬레이션 - 변형lcs

1572 단어 dp
emmmm a, b2 문자열, a열 <=1e6, b열 <=1e3, 그들의lcs를 구합니다.
그 시간의 복잡도는 분명히 문제가 있었다...그러나 우리는lcs가 반드시 <=1e3이라는 것을 발견할 수 있기 때문에 f[i][j]로 b의 앞 i개 안에lcs의 길이가 j라는 것을 나타낸다.
f[i][j]는 우리가 방금 비슷한 방식으로 emmm를 옮길 수 있다.아이디어는 i번째 자모가 가장 긴 공공 서열의 일원이 될 수 있는지를 고려하는 것이다.
마지막으로 출력은 i의 가장 큰 합법적인 f[m][i]를 찾아서 i를 출력하면 됩니다.
#include 
using namespace std;

const int inf=0x3f3f3f3f;
const int maxn=100006;
const int maxm=1006;

int dp[maxm][maxm];
int lena,lenb;
char s1[maxn],s2[maxm];
int nxt[27][maxn];
int wle;

int main(){
	freopen("a.in","r",stdin);
	freopen("a.out","w",stdout);
	scanf("%s",s1+1);
	scanf("%s",s2+1);
	lena=strlen(s1+1);
	lenb=strlen(s2+1);
	memset(dp,inf,sizeof dp);
	memset(nxt,inf,sizeof nxt);
	for (int i=0;i<26;++i){
		for (int j=lena;j>=0;j--){
			nxt[i][j]=nxt[i][j+1];
			if (s1[j]-'a'==i)nxt[i][j]=j;
		}
	}
//	for (int i=0;i<26;++i){
//		printf("
%c:",(char)('a'+i)); // for (int j=0;j<=lena;++j){ // printf("%d ",nxt[i][j]); // } // } // puts("-1-1-"); for (int i=0;i<=lena;++i)dp[i][0]=0; for (int i=1;i<=lenb;++i) { for (int j=1;j<=i;++j) { // printf("%d %d
",i,j); // system("PAUSE"); dp[i][j]=dp[i-1][j]; if (dp[i-1][j-1]<=lena) dp[i][j]=min(dp[i][j],nxt[s2[i]-'a'][dp[i-1][j-1]+1]); } } // puts("010101"); for (int i=0;i<=lenb;++i){ if (dp[lenb][i]==inf)break; wle=i; } printf("%d
",wle); return 0; }

좋은 웹페이지 즐겨찾기