11081 - Strings
Posted: Sat Sep 02, 2006 4:48 pm
O(n^3) dp ? Then, what is the recurance?
or, sth other ?
Can it solved using n^2 ?
Thanks!
or, sth other ?
Can it solved using n^2 ?
Thanks!
Code: Select all
a b c
| | |
a b c
What does it mean ? Would you explain more elaborately.....If match(above) then go if not check the second string just the same way
Code: Select all
aa aa aa
a a aaa
ab ac abc
Code: Select all
10
0
2
Code: Select all
aa aa aa
1)
s1[0]->s3[0]
s1[1]->s3[1] so at the end of s3 return 1;
s2[0]->s3[1] so at the end of s3 return 1;
s2[1]->s3[1] so at the end of s3 return 1;
s1[1]->s3[0]
s2[0]->s3[1] so at the end of s3 return 1;
s2[1]->s3[1] so at the end of s3 return 1;
Denote a = a1a2...ak, b = b1b2...bm and c = c1c2...cn. My DP counts the function f(t,x,y,z) that expresses the number of ways to create string czcx+1...cn from strings axax+1...ak and byby+1...bm under assumption that the character cz is made by a character from b if t=1, or by a character from a if t=0.Riyad wrote:would u care to tell us your DP solution which runs in O(n^3)iLL be really glad to know one
if u dont want to give a spoiler u can PM me ur idea , anywayz thanx for ur reply ...
I've no idea why you're getting TLE. My solution is just a straight forward memoization counting the function mentioned above. But it's rather a short recursive function with no loops and just few recursive calls.vinay wrote:ohh..
I realise that my function is same as
Marko's
then why is it TLE???
Marko can I send u my code
Code: Select all
#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
char s1[61],s2[61],s3[61];
int sz1,sz2,sz3,dp[61][61][61];
int fun(int i,int j,int k){
if(sz1-i+sz2-j<sz3-k) return 0;
if(dp[i][j][k]!=-1) return dp[i][j][k];
dp[i][j][k]=0;
for(int index=i;index<sz1;index++){
if(s1[index]==s3[k]){
if(k==sz3-1) dp[i][j][k]=(dp[i][j][k]+1)%10007;
else
dp[i][j][k]=(dp[i][j][k]+fun(index+1,j,k+1))%10007;
}
}
for(int index=j;index<sz2;index++){
if(s2[index]==s3[k]){
if(k==sz3-1) dp[i][j][k]=(dp[i][j][k]+1)%10007;
else
dp[i][j][k]=(dp[i][j][k]+fun(i,index+1,k+1))%10007;
}
}
return dp[i][j][k]%10007;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%s%s%s",s1,s2,s3);
sz1=strlen(s1);
sz2=strlen(s2);
sz3=strlen(s3);
for(int i=0;i<=sz1;i++){
for(int j=0;j<=sz2;j++){
for(int k=0;k<=sz3;k++){
dp[i][j][k]=-1;
}
}
}
printf("%d\n",fun(0,0,0)%10007);
}
return 0;
}
IMO, your solution is O(N^4). Note the loop in your function.vinay wrote:here it goes...
Code: Select all
1
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa