Dilworth 定理 最长不上升子序列的最少划分数 == 最长上升子序列长度(LIS) LIS 状态表示 dp[i] 表示以a[i] 为结尾的最长上升子序列长度 状态转移方程 dp[i] = max{ dp[j] + 1 }; j∈[1, i - 1] a[i] > a[j] 初值 dp[1 ~ n] = 1 目标 max{ dp[i] } i∈[1 ~ n] LCS 状态表示 dp[i][j] 表示前缀字串a[1 ~ i]和a[1 ~ j]的最长公共子序列 状态转移方程 f[i - 1][j] dp[i][j] = max f[i][j - 1] f[i - 1][ j - 1] + 1 if( a[i] == a[j] ) 初值 dp[1 ~ i][0] = dp[0][1 ~ i] = 0 目标 dp[n][m] LCIS 状态表示 dp[i][j] 表示前缀字串a[1 ~ i]和a[1 ~ j]构成的以b[j]为结尾的LCIS的长度 状态转移方程 a[i] != b[j] dp[i][j] = dp[i - 1][j] a[i] == b[j] dp[i][j] = max{ dp[i - 1][k] + 1} 1 <= k < j b[k] < b[j] == a[i] 初值 dp[i][0] = 0 目标 max{ dp[n][i] } i∈[1 ~ m] code for( int i = 1; i <= n; i ++ ) { int maxx = 1; for( int j = 1; j <= n; j ++ ) { if( a[i] != b[j] ) dp[i][j] = dp[i - 1][j]; else dp[i][j] = max( maxx, dp[i][j]); if( b[j] < a[i] ) maxx = max( maxx, dp[i - 1][j] + 1 ) ; } }