您的位置:首页 > 其它

zoj3034 The Bridges of Kolsberg(DP)

2011-08-20 09:26 447 查看
/*
经典模型:最长公共子序列+字符串处理
*/

View Code

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define max( a, b ) ((a)>(b)?(a):(b))

char LeftOS[ 1001 ][ 12 ];
char RightOS[ 1001 ][ 12 ];
int  LeftID[ 1001 ];
int  LeftV[ 1001 ];
int  RightID[ 1001 ];
int  RightV[ 1001 ];
char OSList[ 1001 ][ 12 ];
int  Match[ 1001 ][ 1001 ];
int  Count[ 1001 ][ 1001 ];
int  Number = 0;

int ID( char * Data )
{
for ( int i = 0 ; i < Number ; ++ i )
if ( !strcmp( OSList[ i ], Data ) )
return i;
strcpy( OSList[ Number ], Data );
return Number ++;
}

int main()
{
int  t,n,m;
char City[ 12 ];
while ( ~scanf("%d",&t) )
while ( t -- ) {
scanf("%d",&n);
for ( int i = 1 ; i <= n ; ++ i )
scanf("%s %s %d",City,LeftOS[ i ],&LeftV[ i ]);
scanf("%d",&m);
for ( int i = 1 ; i <= m ; ++ i )
scanf("%s %s %d",City,RightOS[ i ],&RightV[ i ]);

Number = 0;
for ( int i = 1 ; i <= n ; ++ i )
LeftID[ i ] = ID( LeftOS[ i ] );
for ( int i = 1 ; i <= m ; ++ i )
RightID[ i ] = ID( RightOS[ i ] );

memset( Match, 0, sizeof( Match ) );
memset( Count, 0, sizeof( Count ) );

for ( int i = 1 ; i <= n ; ++ i )
for ( int j = 1 ; j <= m ; ++ j ) {
if ( Match[ i ][ j ] < Match[ i-1 ][ j ] ) {
Match[ i ][ j ] = Match[ i-1 ][ j ];
Count[ i ][ j ] = Count[ i-1 ][ j ];
}
if ( Match[ i ][ j ] < Match[ i ][ j-1 ] ) {
Match[ i ][ j ] = Match[ i ][ j-1 ];
Count[ i ][ j ] = Count[ i ][ j-1 ];
}
if ( LeftID[ i ] == RightID[ j ] && Match[ i ][ j ] < Match[ i-1 ][ j-1 ] + LeftV[ i ] + RightV[ j ] ) {
Match[ i ][ j ] = Match[ i-1 ][ j-1 ] + LeftV[ i ] + RightV[ j ];
Count[ i ][ j ] = Count[ i-1 ][ j-1 ] + 1;
}
}

printf("%d %d\n",Match[ n ][ m ],Count[ n ][ m ]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: