2019 Multi-University Training Contest 1 - 1001 - Blank - dp

http://acm.hdu.edu.cn/showproblem.php?pid=6578

不会做,看题解。

设dp[i][j][k][l]表示4种颜色出现的最后的位置分别是i,j,k,l的方法数,保证i>=j>=k>=l。其实不取=号,因为同一个位置不能放两个元素,除了开始的若干个比如dp[1][0][0][0]=4。

合法的转移叠加:
比如
刷新的颜色是i:dp[i+1][j][k][l]+=dp[i][j][k][l]
刷新的颜色是j:dp[i+1][i][k][l]+=dp[i][j][k][l]
刷新的颜色是k:dp[i+1][i][j][l]+=dp[i][j][k][l]
刷新的颜色是l:dp[i+1][i][k][l]+=dp[i][j][k][l]

假如从dp[i][j][k][l]转移到上述状态会导致新状态不满足约束则不进行这次转移,就太麻烦了。
由于是dp,其实只要遇到约束区间的右端点R的时候再考虑约束就可以了。

考虑四个数其实是[l,k,j,i],i肯定就是R,要是l>=L则有恰好4种颜色,否则要是k>=L则恰好3种颜色,否则要是j>=L则恰好2种颜色,否则只有1种颜色。

对每次转移后新状态的i维度必定是i+1,对i维度进行滚动节省空间。复杂度是精确的O(n^4+mn^3),据说很多队觉得过不了。

猜你喜欢

转载自www.cnblogs.com/Yinku/p/11253382.html