洛谷 P3205:https://www.luogu.org/problemnew/show/P3205
复习区间DPing
把理想队列拆分成
第一个和后面几个 划分成求后面几个的理想队列最后一个和前面几个 划分成求前面几个的理想队列样例:1701 1702 1703 1704
把1701拿出来 求1702 1703 1704的理想队列把1704拿出来 求1701 1702 1703的理想队列因此需要两个数组来划分阶段
f[i][j]为可以排成理想队列中[i,j]区间 且以最后一个排进去是第i人的初始队列种数。
g[i][j]为可以排成理想队列中[i,j]区间 且以最后一个排进去是第j人的初始队列种数。
就可以得出数组f的两种情况:
前一个排进去的人是i+1 当前人插到最左边
if(q[i]<q[i+1]) f[i][j]=(f[i][j]+f[i+1][j])%MOD;
前一个排进去的人是j 当前人插到最左边
if(q[i]<q[j]) f[i][j]=(f[i][j]+g[i+1][j])%MOD;
同理可得数组g的两种情况:
前一个排进去的人是i 当前人插到最右边
if(q[i]<q[j]) g[i][j]=(g[i][j]+f[i][j-1])%MOD;
前一个排进去的人是j-1 当前人插到最右边
if(q[j-1]<q[j]) g[i][j]=(g[i][j]+g[i][j-1])%MOD;
答案存在f[1][n]+g[1][n]中
转载于:https://www.cnblogs.com/BrokenString/p/9478343.html
相关资源:JAVA上百实例源码以及开源项目