トピックへのリンク:http://acm.hdu.edu.cn/showproblem.php?pid=6578
カウントの問題は、それを考える...しかし、サブDP
DP [I] [J] [K] [W] 1-iの最後に出現する降順の数4位の位置のために、私は> = J> => = W Kが、意志MLE後、私は出てスクロールします。
しかし、そこに制限は、あるベクトルメモリのビットを持つすべての制限の右端を押して、それが現在の状態が復帰0を満たしていない場合は、各状態と制限を列挙し、i番目の位置に来ます。
1つの#include <アルゴリズム> 2の#include <iostreamの> 3の#include <cstdioを> 4の#include <ベクトル> 5の#include <CStringの> 6 使って 名前空間STD。 7 typedefの長い 長いLL。 8 のconst int型 MAXN = 100 + 5 。 9 のconst int型 MOD = 998244353 。 10 int型N、M、ANS。 11 int型 DP [ 2 ] [MAXN] [MAXN] [MAXN]。 12ベクター<ペア< INT、INT >> [MAXN]。 13 INT メイン(){ 14 のint POS。 15台の cinを>> POS。 16 一方(pos-- ){ 17 INT ANS = 0 。 18 のscanf(" %D%dの"、&N、&M)。 19 のために(int型 i = 1 ; iが<= N iが++ ) 20 [I] .clear(); 21 のために(int型 I = 0 ;私がm <I ++は{) 22 int型のL、R、X。 23 のscanf(" %D%D%D "、&L&R&X)。 24 [R] .push_back(対< 整数、整数 > (L、X)); 25 } 26 DPは[ 0 ] [ 0 ] [ 0 ] [ 0 ] = 1 。 27 int型になりました= 1 ; 28 のために(int型 i = 1 ; iが<= N I ++は、今^ = 1 ){ 29 のための(INTJ = 0 ; J <= I; J ++ ) 30 のための(INT K = 0 ; K <= Jあり、k ++ ) 31 のための(INT T = 0、T <= K; T ++ ) 32 DP [今] [j] [k]は[T] = 0 ; 33 のための(int型 J = 0 ; J <I、J ++ ) 34 のための(INT K = 0 ; K <= Jあり、k ++ ) 35 のための(INT T = 0、T <= K; T ++ ){ 36 DP [今] [j] [k]は[T] =(DP [今^ 1 ] [j] [k]は[T] + DP [今] [j] [k]の[T])%MOD。 37 DP [今] [I - 1 ] [K] [T] =(DP [今^ 1 ] [j] [k]は[T] + DP [今] [I - 1 ] [K] [T]) %モッズ; 38 DP [今] [I - 1 ] [J] [T] =(DP [今^ 1 ] [j] [k]は[T] + DP [今] [I - 1 ] [J] [T]) %モッズ; 39 DP [今] [I - 1 ] [J] [K] =(DP [今^ 1 ] [j] [k]は[T] + DP [今] [I - 1 ] [J] [K]) %モッズ; 40 } 41 のための(INT J = 0 ; J <I、J ++ ) 42 のための(INT K = 0 ; K <= J; ++ kは) 43 のための(INT T = 0 ; T <= K T ++ ) 44の ための(自動TMP :[i])と 45 であれば(1 +(J> = tmp.first)+(K> = tmp.first)+(T> = tmp.first)=!tmp.second) 46 DP [今] [J ] [K] [T] = 0 ; 47 } 48 今や= N&1 ; 49 のために(int型 I = 0 ; iがN <I ++ ) 50 のための(INT J = 0 ; J <= I; J ++ ) 51 のための(INT K = 0 ; <= J kは、kは++ ) 52の ANS =(ANS + DP [今] [I] [J] [K])%MOD。 53 のprintf(" %d個の\ n " 、ANS)。 54 } 55 56 }