6107
#include <iostream>
#include <string.h>
#include <string>
#include <stdio.h>
#define CRT_SECURE_NO_WARNINGS
int dp[ 101 ] [ 101 ] ;
int path[ 101 ] [ 101 ] ;
using namespace std;
void LCSFindLongest ( char X[ ] , char Y[ ] , int m, int n) ;
void LCS ( int i, int j, char X[ ] ) ;
int main ( ) {
char X[ 100 ] ;
char Y[ 100 ] ;
X[ 0 ] = '!' ;
Y[ 0 ] = '!' ;
int m;
int n;
cin >> m >> n;
for ( int i = 1 ; i <= m; i++ ) {
cin >> X[ i] ;
}
for ( int i = 1 ; i <= n; i++ ) {
cin >> Y[ i] ;
}
X[ m + 1 ] = '\0' ;
Y[ n + 1 ] = '\0' ;
LCSFindLongest ( X, Y, m, n) ;
LCS ( m, n, X) ;
return 0 ;
}
void LCSFindLongest ( char X[ ] , char Y[ ] , int m, int n) {
for ( int i = 1 ; i <= m; i++ ) {
dp[ i] [ 0 ] = 0 ;
}
for ( int i = 1 ; i <= n; i++ ) {
dp[ 0 ] [ i] = 0 ;
}
for ( int i = 1 ; i <= m; i++ ) {
for ( int j = 1 ; j <= n; j++ ) {
if ( X[ i] == Y[ j] ) {
dp[ i] [ j] = dp[ i - 1 ] [ j - 1 ] + 1 ;
path[ i] [ j] = 1 ;
}
else if ( dp[ i - 1 ] [ j] > dp[ i] [ j - 1 ] ) {
dp[ i] [ j] = dp[ i - 1 ] [ j] ;
path[ i] [ j] = 2 ;
}
else if ( dp[ i - 1 ] [ j] < dp[ i] [ j - 1 ] ) {
dp[ i] [ j] = dp[ i] [ j - 1 ] ;
path[ i] [ j] = 3 ;
}
else {
dp[ i] [ j] = dp[ i - 1 ] [ j] ;
path[ i] [ j] = 4 ;
}
}
}
}
void LCS ( int i, int j, char X[ ] ) {
if ( i == 0 || j == 0 ) {
return ;
}
if ( path[ i] [ j] == 1 ) {
LCS ( i - 1 , j - 1 , X) ;
cout << X[ i] ;
}
else if ( path[ i] [ j] == 2 || path[ i] [ j] == 4 ) {
LCS ( i - 1 , j, X) ;
}
else if ( path[ i] [ j] == 3 ) {
LCS ( i, j - 1 , X) ;
}
}
6106
#include <iostream>
#include <string.h>
#include <string>
#include <stdio.h>
#define CRT_SECURE_NO_WARNINGS
using namespace std;
int main ( ) {
int n;
cin >> n;
int orc[ 101 ] [ 101 ] ;
int dp[ 101 ] [ 101 ] ;
int path[ 101 ] [ 101 ] ;
int number[ 101 ] ;
memset ( orc, 0 , sizeof ( orc) ) ;
memset ( dp, 0 , sizeof ( dp) ) ;
memset ( path, 0 , sizeof ( path) ) ;
memset ( number, 0 , sizeof ( number) ) ;
for ( int i = 1 ; i <= n; i++ ) {
for ( int j = 1 ; j <= i; j++ ) {
cin >> orc[ i] [ j] ;
}
}
dp[ 1 ] [ 1 ] = orc[ 1 ] [ 1 ] ;
for ( int i = 1 ; i <= n; i++ ) {
for ( int j = 1 ; j <= i; j++ ) {
if ( dp[ i - 1 ] [ j] > dp[ i - 1 ] [ j - 1 ] ) {
dp[ i] [ j] = dp[ i - 1 ] [ j] + orc[ i] [ j] ;
path[ i] [ j] = 1 ;
}
else {
dp[ i] [ j] = dp[ i - 1 ] [ j - 1 ] + orc[ i] [ j] ;
path[ i] [ j] = 2 ;
}
}
}
int mm = 0 ;
int maxn = 0 ;
for ( int i = 0 ; i <= n; i++ ) {
if ( mm < dp[ n] [ i] ) {
mm = dp[ n] [ i] ;
maxn = i;
}
}
for ( int i = n; i > 0 ; i-- ) {
if ( path[ i] [ maxn] == 1 ) {
number[ i] = orc[ i] [ maxn] ;
maxn = maxn;
}
else if ( path[ i] [ maxn] == 2 ) {
number[ i] = orc[ i] [ maxn] ;
maxn = maxn - 1 ;
}
}
cout << mm << endl;
for ( int i = 1 ; i <= n; i++ ) {
if ( i != n) {
cout << number[ i] << " " ;
}
else cout << number[ i] << endl;
}
return 0 ;
}