Page 1 of 3

10066 - The Twin Towers

Posted: Wed Mar 06, 2002 2:52 pm
by ahanys
I think that i solve this probl em correctly.
I find the longest common subsequence. May be there any numbers that are longer than "long long int".

for example:
in:
2 3
1 2
2 3 4

out:
Twin Towers #1
Number of Tiles : 1

in2
1 2
1
2 3

out2:
Twin Towers #2
Number of Tiles : 0

Is there any error in my input/output.

Thank.



















My program is here:

#include <stdio.h>
void nuluj(long long m,long long n, long long p[][101]) {
for (long i=0; i<=m; i++)
for (long j=0; j<=n; j++)
p[j]=0;
}


long long pole[101][101];
int main() {
long long z=0;
long long m,n;

long long a[101],b[101];

scanf("%lli %llin",&m,&n);
while (m!=0&&n!=0) {
z++;
for (long i=1; i<=m; i++) scanf("%lli",&a);
for (long k=1; k<=n; k++) scanf("%lli",&b[k]);
nuluj(m,n,&pole[0]);


for (long j=1; j<=m; j++) {
if (a[j]==b[1]) pole[1][j]=1;
}

for (long r=2; r<=n; r++)
for (long s=1; s<=m; s++) {
if (a[s]==b[r]) {pole[r][s]=pole[r-1][s-1]+1;}
else {
if (pole[r-1][s]>pole[r][s-1]) pole[r][s]=pole[r-1][s];
else
pole[r][s]=pole[r][s-1];
}
}

printf("Twin Towers #%llin",z);
printf("Number of Tiles : %llinn",pole[n][m]);
scanf("%lli %llin",&m,&n);
}


return 0;
}

Posted: Mon Mar 18, 2002 2:18 pm
by cyfra
Hi!

I couldn't find an error in your program...

Try to make only one dimensional array..

It is quite simple...

I have also tested it a lot but I found nothing...

Maybe you will try to write this task again??

Good Luck :smile:

Ps.
I have realized that after "0 0" your program is still waiting for the key...

Maybe this is the bug..

Posted: Tue Mar 26, 2002 11:42 am
by ahanys
I get accepted. But i don't kow in what an error was. Thanks :smile:

10066 Twin Towers, Problem statement wrong!

Posted: Wed Apr 24, 2002 10:00 pm
by pitfall
The problem states :

the Emperor ordered his architects to remove some of the tiles from the
two towers so that they have exactly the same shape and size,
and at the same time remain as high as possible.

So the towers should be as high as possible not necessirily containing
most number of tiles.

consider the input

5 5
10 10 10 10 500
500 10 10 10 10

the tallest tower is 500 high ( actually 500 x 2 ) but containg 1 tile
the tower containing most number of tile is 4 but 40 high.

so should the answer be 1 or 4 ?
the judge accepts 4.

Read Question Carefully

Posted: Thu Apr 25, 2002 3:03 am
by Ustaad
Hi

The question says the tiles have the same heights and the input provides the radii of the tiles, not the heights !

Ustaad

thanks

Posted: Fri Apr 26, 2002 12:54 am
by pitfall
You are right :roll:

Thanks

10066 ?????? Why WA.

Posted: Sat Nov 22, 2003 10:15 am
by slavej
I'm using LCS here but it doesn't work. WHY??

[c]#include <stdio.h>

int main(void)
{
int common[101][101];
int a[101],b[101];
int i,j,m,n, counter = 0;

scanf("%d%d",&n,&m);
while((n > 0) || (m > 0))
{
++counter;

for (i = 0; i <= 100; ++i)
for (j = 0; j <= 100; ++j)
common[j] = 0;
for (i = 1; i <= n; ++i)
scanf("%d", &a);
for (i = 1; i <= m; ++i)
scanf("%d", &b);

for (i = 1; i <= n; ++i)
for (j = 1; j <= m; ++j)
if (a == b[j])
common[j] = common[i-1][j-1] + 1;
else
if (common[i-1][j] > common[j-1])
common[j] = common[i-1][j];
else
common[j] = common[j-1];

printf("Twin Towers #%d\n",counter);
printf("Number of Tiles : %d\n",common[n][m]);

scanf("%d%d",&n,&m);
if (n)
printf("\n");
}

return(0);
}
[/c]

Posted: Sat Nov 22, 2003 5:01 pm
by titid_gede
i didnt see your code is wrong, and i submitted your code and AC without changing anything.

10066 (twin towers) WA!

Posted: Mon Jul 26, 2004 3:09 am
by midra
Hi!
I get WA in this problem over and over and over...
I don't know WHY!!
here is my code:

[c]
#include <stdio.h>

int lcs(int tn1[],int tn2[],int n1,int n2){
int i,j; /*counters*/
int x,t;
int lcs=0,temp=0;
for (t=1;t<=n1;t++){
x=1;
for (i=t;i<=n1;i++)
for (j=x;j<=n2;j++)
if (tn1==tn2[j]){
temp++;x=j+1;
break;
}
if (temp>lcs) lcs=temp;

temp=0;
}
printf("%d\n\n",lcs);

}

int main()
{
int n1,n2; /*towers*/
int i; /*counter*/
int tn1[101]; /*tiles of n1*/
int tn2[101]; /*tiles of n2*/
int cases=1;
while(scanf("%d %d",&n1,&n2)){
if (n1==0 && n2==0)
break;
for (i=1;i<=n1;i++)
scanf("%d",&tn1);
for (i=1;i<=n2;i++)
scanf("%d",&tn2);
printf("Twin Towers #%d\nNumber of Tiles : ",cases);
cases++;
lcs(tn1,tn2,n1,n2);
}
return 0;
}[/c]

Maybe I missunderstood the problem, or maybe there is some special cases that my code doesn't pass....
if someone could help I would appreciate very much

lcs not right

Posted: Mon Jul 26, 2004 9:12 am
by sohel
You did not misunderstand the problem.. it is a LCS problem...

.. but your LCS function does not seem to be right. And from the look of your algorithm it seems to have a complexity of N^3.. but LCS can be implemented with N^2...

Here is the modified function which got AC.

[c]
int max(int a, int b) {
if( a < b)
return b;
return a;
}

int lcs(int tn1[],int tn2[],int n1,int n2){
int i,j; /*counters*/

int dp[101][101];

for(i=0;i<=n1;i++)
dp[0] = 0;
for(i=0;i<=n2;i++)
dp[0] = 0;
for(i=1;i<=n1;i++)
for(j=1;j<=n2;j++) {
if( tn1 == tn2[j] ) {
dp[j] = dp[i-1][j-1] + 1;
}
else dp[j] = max(dp[i-1][j], dp[j-1]);
}

printf("%d\n\n",dp[n1][n2]);
return 0;

}
[/c]

Hope it helps. :wink:

Posted: Tue Jul 27, 2004 2:48 am
by midra
thank you so much Sohel!!!!
:D :D :D I really appreciate...
but...can you (or someone else) explain me a little more why it works fine this implementation????

thanks!!!!

10066 (Twin Towers) - Why WA??????

Posted: Mon Aug 16, 2004 12:26 pm
by Pavel Nalivaiko
I used simple DP-based algorithm to find LCS. Everything seems to be OK, but I've got WA.

[pascal]
Type Integer = LongInt;
Const MaxN = 100;
Var A, B : Array[1..MaxN] Of Integer;
N, M : Integer;
D : Array[0..MaxN, 0..MaxN] Of Integer;

Function Load : Boolean;
Var I : Integer;
Begin
Load:=False;
Read(N, M);
If (N=0) And (M=0) Then Exit;
Load:=True;
For I:=1 To N Do Read(A);
For I:=1 To M Do Read(B);
End;

Function Max(A, B : Integer):Integer;
Begin
If A>B Then Max:=A Else Max:=B;
End;

Function Get(I, J : Integer):Integer;
Var Res : Integer;
Begin
If D[I, J]<0 Then Begin
If A=B[J] Then Res:=1+Get(I-1, J-1)
Else Res:=Max(Get(I-1, J), Get(I, J-1));
D[I, J]:=Res;
End;
Get:=D[I, J];
End;

Procedure Solve;
Var I, J : Integer;
Begin
For I:=0 To N Do
For J:=0 To M Do
D[I, J]:=-1;
For I:=0 To N Do D[I, 0]:=0;
For I:=0 To M Do D[0, I]:=0;
Get(N, M);
End;

Procedure Save(Iter : Integer);
Begin
Writeln('Twin Towers #', Iter);
Writeln('Number of Tiles = ', D[N, M]);
End;

Var Iter : Integer;
Begin
Iter:=0;
While Load Do Begin
Inc(Iter);
Solve;
Save(Iter);
Writeln;
End;
End.
[/pascal]

I know, that this algorithm could be implemented with classical DP, instead of recursive memorization, but I wan to know WHAT IS WRONG IN THIS CODE?

If anybody could help me?

Posted: Mon Aug 16, 2004 1:06 pm
by little joey
Carefully compare the output from your program with the sample output ... notice any difference? :D

Posted: Mon Aug 16, 2004 2:48 pm
by Pavel Nalivaiko
little joey wrote:Carefully compare the output from your program with the sample output ... notice any difference? :D
OK - I fixed the excess blank line in the end of my output file, by changing the main part for this
[pascal]
Var Iter : Integer;
First : Boolean;
Begin
Iter:=0;
First:=True;
While Load Do Begin
If First Then First:=False Else Writeln;
Inc(Iter);
Solve;
Save(Iter);
End;
End.
[/pascal]

But still WA..
May be I am a bit of idiot ;) - but I don't see any other difference..

Posted: Mon Aug 16, 2004 3:26 pm
by Pavel Nalivaiko
Oh, I understand :)

I used a pdf-version of this problem, in wich the symbol '=' is used instead of ':' :)