Solution -「USACO 2020.12 P」Spaceship
Rainybunny · · 题解
来这里看叭~
\mathcal{Description}
Link.
Bessie 在一张含
给定
\mathcal{Solution}
大概是图上的高维大力 DP 题叭。
初步理解按键规则:若把
进一步,我们尝试以“非激活按键的最高位”为切入点设计 DP 状态。令
-
当前方案根本没有取到过
h ,f(h,i,j)\longleftarrow f(h-1,i,j) 。 -
否则,枚举取到
h 的唯一一点k ,显然有f(h,i,j)\longleftarrow\sum_{(u,k),(k,v)\in E}f(h-1,i,u)f(h-1,v,j) 注意到
h 和k 正在枚举,视为常数,乘法中的两个状态分别只和i 与j 有关,所以只需要定义辅助状态g(i)=\sum_{(u,k)\in E}f(h-1,i,u) h(j)=\sum_{(k,v)\in E}f(h-1,v,j) 则有
f(h,i,j)\longleftarrow g(i)h(j) 。
最后一个问题,求出这个
可见,第
综上,复杂度
\mathcal{Code}
/* Clearink */
#include <cstdio>
#define rep( i, l, r ) for ( int i = l, rpbound##i = r; i <= rpbound##i; ++i )
#define per( i, r, l ) for ( int i = r, rpbound##i = l; i >= rpbound##i; --i )
const int MAXN = 60, MOD = 1e9 + 7;
int n, m, q, f[MAXN + 5][MAXN * 2 + 5][MAXN * 2 + 5];
int lef[MAXN * 2 + 5], rig[MAXN * 2 + 5];
char adj[MAXN + 5][MAXN + 5];
struct Query { int bs, s, bt, t; } qry[MAXN + 5];
inline int mul( const long long a, const int b ) { return a * b % MOD; }
inline int add( int a, const int b ) { return ( a += b ) < MOD ? a : a - MOD; }
inline void addeq( int& a, const int b ) { ( a += b ) >= MOD && ( a -= MOD ); }
int main() {
scanf( "%d %d %d", &n, &m, &q );
rep ( i, 1, n ) {
scanf( "%s", adj[i] + 1 );
rep ( j, 1, n ) adj[i][j] ^= '0';
}
rep ( i, 1, q ) {
scanf( "%d %d %d %d", &qry[i].bs, &qry[i].s, &qry[i].bt, &qry[i].t );
}
rep ( h, 1, m ) {
int ( *fcur )[MAXN * 2 + 5]( f[h] );
int ( *flas )[MAXN * 2 + 5]( f[h - 1] );
rep ( i, 1, n + q ) rep ( j, 1, n + q ) fcur[i][j] = flas[i][j];
rep ( k, 1, n ) {
rep ( i, 1, n ) lef[i] = rig[i] = 0;
lef[k] = rig[k] = 1;
rep ( i, 1, q ) {
lef[n + i] = qry[i].bs == h && qry[i].s == k;
rig[n + i] = qry[i].bt == h && qry[i].t == k;
}
rep ( i, 1, n + q ) rep ( j, 1, n ) if ( adj[j][k] ) {
addeq( lef[i], flas[i][j] );
}
rep ( i, 1, n ) rep ( j, 1, n + q ) if ( adj[k][i] ) {
addeq( rig[j], flas[i][j] );
}
rep ( i, 1, n + q ) rep ( j, 1, n + q ) {
addeq( fcur[i][j], mul( lef[i], rig[j] ) );
}
}
}
rep ( i, 1, q ) printf( "%d\n", f[m][n + i][n + i] );
return 0;
}