方格取数
# include <bits/stdc++.h>
using namespace std;
const int N= 11 ;
int g[ N] [ N] ;
int f[ 2 * N] [ N] [ N] ;
int main ( ) {
int n;
cin >> n;
int a, b, c;
while ( cin>> a>> b>> c, a) {
g[ a] [ b] = c;
}
for ( int k= 2 ; k<= 2 * n; k++ ) {
for ( int i1= 1 ; i1<= n; i1++ ) {
for ( int i2= 1 ; i2<= n; i2++ ) {
int j1= k- i1, j2= k- i2;
if ( j1<= n&& j1>= 1 && j2<= n&& j2>= 1 ) {
int & x= f[ k] [ i1] [ i2] ;
int t = g[ i1] [ j1] ;
if ( i1!= i2) t += g[ i2] [ j2] ;
x = max ( x, f[ k- 1 ] [ i1- 1 ] [ i2- 1 ] + t) ;
x = max ( x, f[ k- 1 ] [ i1- 1 ] [ i2] + t) ;
x = max ( x, f[ k- 1 ] [ i1] [ i2- 1 ] + t) ;
x = max ( x, f[ k- 1 ] [ i1] [ i2] + t) ;
}
}
}
}
cout << f[ 2 * n] [ n] [ n] << endl;
return 0 ;
}
参考题解
# include <bits/stdc++.h>
# define x first
# define y second
const int N= 5050 ;
using namespace std;
pair< int , int > h[ N] ;
int f[ N] ;
int n;
int main ( ) {
cin >> n;
for ( int i= 1 ; i<= n; i++ ) {
cin >> h[ i] . x >> h[ i] . y;
f[ i] = 1 ;
}
sort ( h+ 1 , h+ n+ 1 ) ;
int ans= 0 ;
for ( int i= n; i>= 1 ; i-- ) {
for ( int j= i+ 1 ; j<= n; j++ ) {
if ( h[ i] . y< h[ j] . y) {
f[ i] = max ( f[ i] , f[ j] + 1 ) ;
}
ans= max ( ans, f[ i] ) ;
}
}
cout << ans << endl;
return 0 ;
}
参考题解
# include <bits/stdc++.h>
using namespace std;
const int N= 3030 ;
int a[ N] , b[ N] ;
int f[ N] [ N] ;
int n;
int main ( ) {
cin >> n;
for ( int i= 1 ; i<= n; i++ ) cin>> a[ i] ;
for ( int j= 1 ; j<= n; j++ ) cin>> b[ j] ;
for ( int i= 1 ; i<= n; i++ ) {
for ( int j= 1 ; j<= n; j++ ) {
f[ i] [ j] = f[ i- 1 ] [ j] ;
int maxv= 1 ;
if ( a[ i] == b[ j] ) {
for ( int k= 1 ; k< j; k++ ) {
if ( b[ k] < b[ j] ) {
maxv= max ( maxv, f[ i- 1 ] [ k] + 1 ) ;
}
}
f[ i] [ j] = max ( f[ i] [ j] , maxv) ;
}
}
}
int ans= 0 ;
for ( int i= 1 ; i<= n; i++ ) {
ans= max ( ans, f[ n] [ i] ) ;
}
cout << ans ;
return 0 ;
}
参考题解
# include <bits/stdc++.h>
using namespace std;
const int N= 1010 ;
int n, m;
int f[ N] ;
int main ( ) {
cin >> n >> m;
for ( int i= 1 ; i<= n; i++ ) {
int a, b, c;
cin >> a >> b >> c;
if ( c== 0 ) {
for ( int j= a; j<= m; j++ ) {
f[ j] = max ( f[ j] , f[ j- a] + b) ;
}
}
else {
if ( c== - 1 ) c= 1 ;
for ( int k= 1 ; k<= c; k= k* 2 ) {
for ( int j= m; j>= a* k; j-- ) {
f[ j] = max ( f[ j] , f[ j- a* k] + b* k) ;
}
c-= k;
}
if ( c) {
for ( int j= m; j>= c* a; j-- ) {
f[ j] = max ( f[ j] , f[ j- a* c] + b* c) ;
}
}
}
}
cout << f[ m] ;
return 0 ;
}
# include <bits/stdc++.h>
using namespace std;
const int N= 1010 ;
int f[ N] [ N] ;
int v1, v2, n;
int a[ N] , b[ N] , c[ N] ;
int main ( ) {
cin >> v1 >> v2 >> n;
for ( int i= 1 ; i<= n; i++ ) {
cin >> a[ i] >> b[ i] >> c[ i] ;
}
memset ( f, 0x3f , sizeof f) ;
f[ 0 ] [ 0 ] = 0 ;
for ( int i= 1 ; i<= n; i++ ) {
for ( int j= v1; j>= 0 ; j-- ) {
for ( int k= v2; k>= 0 ; k-- ) {
f[ j] [ k] = min ( f[ j] [ k] , f[ max ( 0 , j- a[ i] ) ] [ max ( k- b[ i] , 0 ) ] + c[ i] ) ;
}
}
}
cout << f[ v1] [ v2] ;
return 0 ;
}
# include <bits/stdc++.h>
using namespace std;
const int N= 20 ;
int g[ N] [ N] ;
int f[ N] [ N] ;
int n, m;
int main ( ) {
cin >> n >> m;
for ( int i= 1 ; i<= n; i++ ) {
for ( int j= 1 ; j<= m; j++ ) {
cin >> g[ i] [ j] ;
}
}
for ( int i= 1 ; i<= n; i++ ) {
for ( int j= 0 ; j<= m; j++ ) {
for ( int k= 0 ; k<= j; k++ ) {
f[ i] [ j] = max ( f[ i] [ j] , f[ i- 1 ] [ j- k] + g[ i] [ k] ) ;
}
}
}
cout<< f[ n] [ m] << endl;
for ( int i= n; i>= 1 ; i-- ) {
for ( int j= 0 ; j<= m; j++ ) {
if ( f[ i] [ m] == f[ i- 1 ] [ m- j] + g[ i] [ j] ) {
cout<< i << " " << j << endl;
m-= j;
break ;
}
}
}
return 0 ;
}
# include <iostream>
# include <cstring>
# include <algorithm>
using namespace std;
const int N= 1010 ;
int n, m;
int idx, h[ N] , e[ N] , ne[ N] , w[ N] , v[ N] ;
int f[ N] [ N] ;
void add ( int a, int b) {
e[ idx] = b, ne[ idx] = h[ a] , h[ a] = idx++ ;
}
void dfs ( int u) {
for ( int i= v[ u] ; i<= m; i++ ) f[ u] [ i] = w[ u] ;
for ( int i= h[ u] ; i!= - 1 ; i= ne[ i] ) {
int son= e[ i] ;
dfs ( son) ;
for ( int j= m; j>= v[ u] ; j-- ) {
for ( int k= 0 ; j- k>= v[ u] ; k++ ) {
f[ u] [ j] = max ( f[ u] [ j] , f[ u] [ j- k] + f[ son] [ k] ) ;
}
}
}
}
int main ( ) {
cin >> n >> m;
memset ( h, - 1 , sizeof h) ;
int st;
for ( int i= 1 ; i<= n; i++ ) {
int a, b, c;
cin >> a >> b >> c;
v[ i] = a, w[ i] = b;
if ( c== - 1 ) {
st= i;
continue ;
}
add ( c, i) ;
}
dfs ( st) ;
cout << f[ st] [ m] ;
return 0 ;
}
# include <bits/stdc++.h>
using namespace std;
const int N= 1010 ;
int f[ N] [ N] ;
int g[ N] [ N] ;
int n, m;
int v[ N] , w[ N] ;
int mod= 1e9 + 7 ;
int main ( ) {
cin >> n >> m;
for ( int i= 1 ; i<= n; i++ ) {
cin >> v[ i] >> w[ i] ;
}
memset ( f, - 0x3f , sizeof f) ;
f[ 0 ] [ 0 ] = 0 ;
g[ 0 ] [ 0 ] = 1 ;
int maxx= 0 ;
for ( int i= 1 ; i<= n; i++ ) {
for ( int j= 0 ; j<= m; j++ ) {
f[ i] [ j] = f[ i- 1 ] [ j] ;
if ( j>= v[ i] ) {
f[ i] [ j] = max ( f[ i- 1 ] [ j] , f[ i- 1 ] [ j- v[ i] ] + w[ i] ) ;
}
if ( f[ i] [ j] == f[ i- 1 ] [ j] ) {
g[ i] [ j] = ( g[ i] [ j] + g[ i- 1 ] [ j] ) % mod;
}
if ( f[ i] [ j] == f[ i- 1 ] [ j- v[ i] ] + w[ i] && j>= v[ i] ) {
g[ i] [ j] = ( g[ i] [ j] + g[ i- 1 ] [ j- v[ i] ] ) % mod;
}
}
}
int tmp= 0 ; ;
for ( int i= 1 ; i<= n; i++ ) {
for ( int j= 0 ; j<= m; j++ ) {
if ( f[ i] [ j] > tmp) tmp= f[ i] [ j] ;
}
}
int res= 0 ;
for ( int j= 0 ; j<= m; j++ ) {
if ( tmp== f[ n] [ j] ) {
res= ( res+ g[ n] [ j] ) % mod;
}
}
cout << res;
return 0 ;
}
# include <bits/stdc++.h>
# define int long long
using namespace std;
const int N= 12 , M= 1 << 11 ;
vector< int > state;
vector< int > st[ M] ;
int n, m;
int cnt[ M] ;
int f[ N] [ 110 ] [ M] ;
int num ( int x) {
int sum= 0 ;
while ( x) {
if ( x& 1 ) {
sum++ ;
}
x= x>> 1 ;
}
return sum;
}
signed main ( ) {
int n, m;
cin >> n >> m;
for ( int i= 0 ; i< 1 << n; i++ ) {
if ( ! ( i& ( i>> 1 ) ) ) {
state. push_back ( i) ;
cnt[ i] = num ( i) ;
}
}
f[ 0 ] [ 0 ] [ 0 ] = 1 ;
for ( int i= 0 ; i< ( int ) state. size ( ) ; i++ ) {
for ( int j= 0 ; j< ( int ) state. size ( ) ; j++ ) {
int a= state[ i] , b= state[ j] ;
if ( ! ( a& b) && ! ( a& ( b>> 1 ) ) && ! ( a& ( b<< 1 ) ) ) {
st[ i] . push_back ( j) ;
}
}
}
for ( int i= 1 ; i<= n; i++ ) {
for ( int j= 0 ; j<= m; j++ ) {
for ( int k= 0 ; k< ( int ) state. size ( ) ; k++ ) {
int a= cnt[ state[ k] ] ;
if ( j< a) continue ;
for ( int l= 0 ; l< ( int ) st[ k] . size ( ) ; l++ ) {
f[ i] [ j] [ k] += f[ i- 1 ] [ j- a] [ st[ k] [ l] ] ;
}
}
}
}
int res= 0 ;
for ( int i= 0 ; i< ( int ) state. size ( ) ; i++ ) {
res+= f[ n] [ m] [ i] ;
}
cout << res;
return 0 ;
}
# include <bits/stdc++.h>
# define int long long
using namespace std;
const int N= 12 , M= 1 << 11 ;
vector< int > state;
vector< int > st[ M] ;
int n, m;
int cnt[ M] ;
int f[ N] [ 110 ] [ M] ;
int num ( int x) {
int sum= 0 ;
while ( x) {
if ( x& 1 ) {
sum++ ;
}
x= x>> 1 ;
}
return sum;
}
signed main ( ) {
int n, m;
cin >> n >> m;
for ( int i= 0 ; i< 1 << n; i++ ) {
if ( ! ( i& ( i>> 1 ) ) ) {
state. push_back ( i) ;
cnt[ i] = num ( i) ;
}
}
f[ 0 ] [ 0 ] [ 0 ] = 1 ;
for ( int i= 0 ; i< ( int ) state. size ( ) ; i++ ) {
for ( int j= 0 ; j< ( int ) state. size ( ) ; j++ ) {
int a= state[ i] , b= state[ j] ;
if ( ! ( a& b) && ! ( a& ( b>> 1 ) ) && ! ( a& ( b<< 1 ) ) ) {
st[ a] . push_back ( b) ;
}
}
}
for ( int i= 1 ; i<= n; i++ ) {
for ( int j= 0 ; j<= m; j++ ) {
for ( int k= 0 ; k< ( int ) state. size ( ) ; k++ ) {
int a= cnt[ state[ k] ] ;
if ( j< a) continue ;
for ( int l= 0 ; l< ( int ) st[ state[ k] ] . size ( ) ; l++ ) {
f[ i] [ j] [ state[ k] ] += f[ i- 1 ] [ j- a] [ st[ state[ k] ] [ l] ] ;
}
}
}
}
int res= 0 ;
for ( int i= 0 ; i< ( int ) state. size ( ) ; i++ ) {
res+= f[ n] [ m] [ state[ i] ] ;
}
cout << res;
return 0 ;
}
# include <iostream>
# include <cstring>
# define int long long
using namespace std;
const int N= 220 ;
int n, k, x;
int f[ N] [ N] ;
int a[ N] ;
signed main ( ) {
cin >> n >> k >> x;
for ( int i= 1 ; i<= n; i++ ) cin>> a[ i] ;
memset ( f, - 0x3f , sizeof f) ;
f[ 0 ] [ 0 ] = 0 ;
for ( int i= 1 ; i<= n; i++ ) {
for ( int j= 1 ; j<= x; j++ ) {
for ( int t= i- k; t< i; t++ ) {
if ( t>= 0 ) f[ i] [ j] = max ( f[ i] [ j] , f[ t] [ j- 1 ] + a[ i] ) ;
}
}
}
int res= - 1 ;
for ( int i= n- k+ 1 ; i<= n; i++ ) {
res= max ( res, f[ i] [ x] ) ;
}
cout << res;
return 0 ;
}
# include <iostream>
# include <algorithm>
# include <cstring>
using namespace std;
const int N= 210 , INF= 0x3f3f3f3f ;
int n;
int a[ N] ;
int g[ N] [ N] ;
int main ( )
{
cin>> n;
for ( int i= 1 ; i<= n; i++ )
{
cin>> a[ i] ;
a[ i+ n] = a[ i] ;
}
memset ( g, - 0x3f , sizeof g) ;
for ( int len= 1 ; len<= n; len++ )
for ( int i= 1 ; i+ len- 1 <= n* 2 ; i++ )
{
int l= i, r= i+ len- 1 ;
if ( len== 1 ) g[ l] [ r] = 0 ;
else for ( int k= l; k< r; k++ ) g[ l] [ r] = max ( g[ l] [ r] , g[ l] [ k] + g[ k+ 1 ] [ r] + a[ l] * a[ k+ 1 ] * a[ r+ 1 ] ) ;
}
int maxv= - INF;
for ( int i= 1 ; i<= n; i++ )
maxv= max ( g[ i] [ i+ n- 1 ] , maxv) ;
cout<< maxv << endl;
return 0 ;
}
# include <bits/stdc++.h>
using namespace std;
const int N= 35 ;
int f[ N] [ N] ;
int g[ N] [ N] ;
int n;
int w[ N] ;
void path ( int l, int r) {
if ( l> r) {
return ;
}
cout << g[ l] [ r] << " " ;
path ( l, g[ l] [ r] - 1 ) ;
path ( g[ l] [ r] + 1 , r) ;
}
int main ( ) {
cin >> n;
for ( int i= 1 ; i<= n; i++ ) {
cin >> w[ i] ;
g[ i] [ i] = i;
f[ i] [ i] = w[ i] ;
}
for ( int len= 2 ; len<= n; len++ ) {
for ( int l= 1 ; l+ len- 1 <= n; l++ ) {
int r= l+ len- 1 ;
for ( int k= l; k<= r; k++ ) {
int left, right;
if ( k== l) {
left= 1 ;
}
else {
left= f[ l] [ k- 1 ] ;
}
if ( r== k) {
right= 1 ;
}
else {
right= f[ k+ 1 ] [ r] ;
}
if ( left* right+ w[ k] > f[ l] [ r] ) {
f[ l] [ r] = left* right+ w[ k] ;
g[ l] [ r] = k;
}
} }
}
cout << f[ 1 ] [ n] << endl;
path ( 1 , n) ;
return 0 ;
}
# include <iostream>
# include <cstring>
using namespace std;
const int N= 10010 ;
int h[ N* 2 ] , w[ N* 2 ] , ne[ N* 2 ] , idx, e[ N* 2 ] ;
void add ( int a, int b, int c) {
e[ idx] = b, ne[ idx] = h[ a] , w[ idx] = c, h[ a] = idx++ ;
}
int n;
int f[ N] ;
int dfs ( int u, int father) {
int max1= 0 , max2= 0 ;
for ( int i= h[ u] ; i!= - 1 ; i= ne[ i] ) {
int j= e[ i] ;
if ( j== father) continue ;
int tmp= dfs ( j, u) + w[ i] ;
if ( tmp>= max1) {
max2= max1;
max1= tmp;
}
else if ( tmp> max2) {
max2= tmp;
}
}
f[ u] = max1+ max2;
return max1;
}
int main ( ) {
memset ( h, - 1 , sizeof h) ;
cin >> n;
for ( int i= 1 ; i<= n- 1 ; i++ ) {
int a, b, c;
cin >> a >> b >> c;
add ( a, b, c) ;
add ( b, a, c) ;
}
int res= 0 ;
dfs ( 1 , - 1 ) ;
for ( int i= 1 ; i<= n; i++ ) {
res= max ( res, f[ i] ) ;
}
cout << res;
return 0 ;
}
按照自己的理解写的 确实是比较麻烦
# include <iostream>
# include <cstring>
using namespace std;
const int N= 10010 ;
int h[ N* 2 ] , w[ N* 2 ] , ne[ N* 2 ] , idx, e[ N* 2 ] ;
void add ( int a, int b, int c) {
e[ idx] = b, ne[ idx] = h[ a] , w[ idx] = c, h[ a] = idx++ ;
}
int n;
int f[ N] ;
int max1[ N] , max2[ N] , up[ N] ;
int num[ N] ;
int dfs ( int u, int father) {
for ( int i= h[ u] ; i!= - 1 ; i= ne[ i] ) {
int j= e[ i] ;
if ( j== father) continue ;
int tmp= dfs ( j, u) + w[ i] ;
if ( tmp>= max1[ u] ) {
max2[ u] = max1[ u] ;
max1[ u] = tmp;
num[ u] = j;
}
else if ( tmp> max2[ u] ) {
max2[ u] = tmp;
}
}
return max1[ u] ;
}
void dfs2 ( int u, int father) {
for ( int i= h[ u] ; i!= - 1 ; i= ne[ i] ) {
int j= e[ i] ;
if ( j== father) continue ;
if ( num[ u] == j) {
if ( max2[ u] + w[ i] > max1[ j] ) {
max2[ j] = max1[ j] ;
max1[ j] = max2[ u] + w[ i] ;
num[ j] = u;
}
else if ( max2[ u] + w[ i] > max2[ j] ) {
max2[ j] = max2[ u] + w[ i] ;
}
}
else {
if ( max1[ u] + w[ i] > max1[ j] ) {
max2[ j] = max1[ j] ;
max1[ j] = max1[ u] + w[ i] ;
num[ j] = u;
}
else if ( max1[ u] + w[ i] > max2[ j] ) {
max2[ j] = max1[ u] + w[ i] ;
}
}
dfs2 ( j, u) ;
}
}
int main ( ) {
memset ( h, - 1 , sizeof h) ;
cin >> n;
for ( int i= 1 ; i<= n- 1 ; i++ ) {
int a, b, c;
cin >> a >> b >> c;
add ( a, b, c) ;
add ( b, a, c) ;
}
int res= 0x3f3f3f3f ;
dfs ( 1 , - 1 ) ;
dfs2 ( 1 , - 1 ) ;
for ( int i= 1 ; i<= n; i++ ) {
res= min ( res, max1[ i] ) ;
}
cout << res;
return 0 ;
}
y总代码
# include <bits/stdc++.h>
using namespace std;
const int N= 1e4 + 10 ;
int n;
int h[ N] , w[ N* 2 ] , e[ N* 2 ] , ne[ N* 2 ] , idx;
int dn1[ N] , dn2[ N] , up[ N] , son1[ N] , son2[ N] ;
void add ( int a, int b, int c) {
e[ idx] = b, ne[ idx] = h[ a] , w[ idx] = c, h[ a] = idx++ ;
}
void dfs_down ( int u, int father) {
for ( int i= h[ u] ; ~ i; i= ne[ i] ) {
int j= e[ i] ;
if ( j== father) continue ;
dfs_down ( j, u) ;
if ( w[ i] + dn1[ j] >= dn1[ u] ) {
dn2[ u] = dn1[ u] ;
dn1[ u] = w[ i] + dn1[ j] ;
son2[ u] = son1[ u] ;
son1[ u] = j;
}
else if ( w[ i] + dn1[ j] > dn2[ u] ) {
dn2[ u] = w[ i] + dn1[ j] ;
son2[ u] = j;
}
}
return ;
}
void dfs_up ( int u, int father) {
for ( int i= h[ u] ; ~ i; i= ne[ i] ) {
int j= e[ i] ;
if ( j== father) continue ;
if ( j== son1[ u] ) {
up[ j] = max ( up[ u] + w[ i] , dn2[ u] + w[ i] ) ;
}
else {
up[ j] = max ( up[ u] + w[ i] , dn1[ u] + w[ i] ) ;
}
dfs_up ( j, u) ;
}
return ;
}
int main ( ) {
memset ( h, - 1 , sizeof h) ;
cin >> n;
for ( int i= 0 ; i< n- 1 ; i++ ) {
int a, b, c;
cin >> a >> b >> c;
add ( a, b, c) , add ( b, a, c) ;
}
dfs_down ( 1 , - 1 ) ;
dfs_up ( 1 , - 1 ) ;
int ans= 0x3f3f3f3f ;
for ( int i= 1 ; i<= n; i++ ) {
ans= min ( ans, max ( up[ i] , dn1[ i] ) ) ;
}
cout << ans;
return 0 ;
}
# include <bits/stdc++.h>
# define x first
# define y second
using namespace std;
const int N= 110 ;
typedef pair< int , int > PII;
PII q[ N* N] ;
int dx[ 8 ] = { - 1 , 0 , 1 , - 1 , 1 , - 1 , 0 , 1 } , dy[ 8 ] = { 1 , 1 , 1 , 0 , 0 , - 1 , - 1 , - 1 } ;
char g[ N] [ N] ;
int n, m, num;
void bfs ( int a, int b)
{
q[ num ++ ] = { a, b} ;
g[ a] [ b] = '0' ;
queue< PII> p;
p. push ( { a, b} ) ;
while ( p. size ( ) ) {
auto t= p. front ( ) ;
p. pop ( ) ;
for ( int i= 0 ; i< 8 ; i++ ) {
int X= t. x+ dx[ i] , Y= t. y+ dy[ i] ;
if ( X>= 0 && X< n&& Y>= 0 && Y< m&& g[ X] [ Y] == '1' ) {
q[ num++ ] = { X, Y} ;
g[ X] [ Y] = '0' ;
p. push ( { X, Y} ) ;
}
}
}
}
double get_dist ( PII a, PII b) {
return sqrt ( ( b. y- a. y) * ( b. y- a. y) + ( b. x- a. x) * ( b. x- a. x) ) ;
}
double get_hash ( ) {
double res= 0 ;
for ( int i= 0 ; i< num; i++ ) {
for ( int j= i+ 1 ; j< num; j++ ) {
res+= get_dist ( q[ i] , q[ j] ) ;
}
}
return res;
}
char get_id ( double key) {
static double hash[ 30 ] ;
static int id= 0 ;
for ( int i= 0 ; i< id; i++ ) {
if ( fabs ( key- hash[ i] ) < 1e-8 ) {
return i+ 'a' ;
}
}
hash[ id++ ] = key;
return id- 1 + 'a' ;
}
int main ( ) {
cin >> m >> n;
for ( int i= 0 ; i< n; i++ ) cin>> g[ i] ;
for ( int i= 0 ; i< n; i++ ) {
for ( int j= 0 ; j< m; j++ ) {
if ( g[ i] [ j] == '1' ) {
num= 0 ;
bfs ( i, j) ;
char f= get_id ( get_hash ( ) ) ;
for ( int k= 0 ; k< num; k++ ) {
g[ q[ k] . x] [ q[ k] . y] = f;
}
}
}
}
for ( int i= 0 ; i< n; i++ ) cout << g[ i] << endl;
return 0 ;
}
# include <iostream>
# include <cstring>
# include <unordered_map>
using namespace std;
const int N= 220 ;
unordered_map< string, int > id;
int g[ N] [ N] ;
int n, m;
int main ( ) {
cin >> m >> n;
for ( int i= 0 ; i< n; i++ ) {
string tmp;
cin >> tmp;
id[ tmp] = i;
}
string name[ N] ;
while ( m-- ) {
for ( int i= 0 ; i< n; i++ ) cin>> name[ i] ;
for ( int i= 0 ; i< n; i++ ) {
int j= i+ 1 ;
while ( j< n&& name[ j] > name[ j- 1 ] ) j++ ;
while ( j< n) {
int a= id[ name[ i] ] , b= id[ name[ j] ] ;
g[ a] [ b] = 1 ;
j++ ;
}
}
}
for ( int i= 0 ; i< n; i++ ) {
for ( int j= 0 ; j< n; j++ ) {
if ( i== j) cout << "B" ;
else if ( g[ i] [ j] == 0 && g[ j] [ i] == 0 ) cout << "?" ;
else if ( g[ j] [ i] = 1 && g[ i] [ j] != 1 ) cout<< 1 ;
else cout << 0 ;
}
cout << endl;
}
return 0 ;
}
# include <iostream>
using namespace std;
const int N = 1000 ;
int f[ N] ;
string ss;
int main ( )
{
ss = "tocyjkdzcieoiodfpbgcncsrjbhmugdnojjddhllnofawllbhfiadgdcdjstemphmnjihecoapdjjrprrqnhgccevdarufmliqijgihhfgdcmxvicfauachlifhafpdccfseflcdgjncadfclvfmadvrnaaahahndsikzssoywakgnfjjaihtniptwoulxbaeqkqhfwl" ;
for ( int i = 0 ; i < ss. size ( ) ; i ++ )
{
f[ i] = 1 ;
for ( int j = 0 ; j < i; j ++ )
{
if ( ss[ i] > ss[ j] ) f[ i] += f[ j] ;
if ( ss[ i] == ss[ j] ) f[ i] -= f[ j] ;
}
}
long long res = 0 ;
for ( int i = 0 ; i < ss. size ( ) ; i ++ ) res += f[ i] ;
cout << res << endl;
return 0 ;
}
参考题解