51nod 1370 排列与操作

来源:互联网 发布:剑三编辑器骨骼数据 编辑:程序博客网 时间:2024/06/05 00:45

给定N长排列P,其中排列指数集{1,2,3...N}组成的一个序列,序列中每个元素恰好出现一次。初始时这个排列是给出的。之后你可以进行不超过K次操作(也就是说你可以操作0次,1次..K次),每次操作如下:
1)选择一个连续的非空的子区间[L,R],其对应元素为{P[L],P[L+1],..,P[R]};
2)设这个区间元素最大值为MAX,测将这个区间的所有元素都重新赋值为MAX。
问在K次以内的操作中,你一共能构造出多少种不同的序列出来,输出这个结果 modulo1,000,000,007后的结果。

注意:两个序列A,B不同是指存在元素位置下标 i,满足A[i]!=B[i].
提示:样例中第2个小数据可以构造的4组结果包括:(3, 1, 2),(3, 2, 2),(3, 3, 2),(3, 3, 3).
Input
多组测试数据,第一行一个整数T,表示测试数据数量,1<=T<=3。每组测试数据有相同的结构构成。每组数据的第一行包含两个整数N,K,其中1<=N<=200,0<=K<=200。接下来N行每行一个整数Pi,表示排列P中第i个元素,保证1~N各出现一次。
Output
每组数据一行输出,即能构造的不同序列个数mod 10^9+7后的结果。
Input示例
32 1123 23124 24321
Output示例
2413
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

DP+思路~

可以发现最后获得的段一定满足:每种颜色最多在某一段中出现,且a[i]最多能更改直至前后第一个大于它的数。

我们预处理出每个位置能更改到的前驱后继la[i],ne[i]。

用f[i][j][k]表示到第i个位置时,已经更改了j段,一直到k都被更改的方案数。那么i可以空出,用来覆盖其它点,或者已经被其它覆盖。DP即可。


#include<cstdio>#include<cstring>#include<iostream>using namespace std;#define ll long longconst int mod=1e9+7;const int inf=0x7fffffff;int t,n,K,a[205],f[205][205][205],la[205],ne[205],g[205],ans;int read(){int x=0,f=1;char ch=getchar();while(ch<'0' || ch>'9') {if(ch=='-') f=-1;ch=getchar();}while(ch>='0' && ch<='9') {x=x*10+ch-'0';ch=getchar();}return x*f;}void add(int &a,int b){a=a+b<mod ? a+b:a+b-mod;}int main(){t=read();while(t--){n=read();K=read();a[0]=a[n+1]=inf;for(int i=1;i<=n;i++) a[i]=read();memset(f,0,sizeof(f));ans=0;f[0][0][0]=1;for(int i=1;i<=n;i++){for(int j=i-1;~j;j--)  if(a[j]>a[i])  {  la[i]=j;break;  }for(int j=i+1;j<=n+1;j++)  if(a[j]>a[i])  {  ne[i]=j;break;  }}for(int i=1;i<=n;i++)  for(int j=0;j<=i && j<=K;j++)  {  for(int k=0;k<=n;k++) add(f[i][j][k],f[i-1][j][k]);  memset(g,0,sizeof(g));  for(int k=la[i];k<ne[i]-1;k++)    if(k==i-1)    {  add(f[i][j][k+1],f[i-1][j][k]);  add(g[k+2],f[i-1][j][k]);     }     else add(g[k+1],f[i-1][j][k]);   for(int k=la[i]+1;k<ne[i];k++)   {   add(g[k],g[k-1]);   add(f[i][j+1][k],g[k]);   }  }for(int i=0;i<=K;i++) add(ans,f[n][i][n]);printf("%d\n",ans);}return 0;}


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 误食发热包的水怎么办 玻璃饭盒加热后盖子打不开怎么办 玻璃饭盒盖子被吸住了怎么办 微波炉加热饭盒盖子打不开怎么办 铁饭盒盖子打不开了怎么办 塑料玻璃饭盒打不开了怎么办 方便火锅没有发热包怎么办 加热包的水溢出怎么办 军用黄脸盆坏了怎么办 白瓷洗手盆发黄怎么办 挎包没有拉链东西容易掉怎么办 斜挎包肩带长了怎么办 3个月宝宝不吃奶怎么办 米饭扔厕所堵了怎么办 门过梁搭接不够怎么办 华为g7开不了机怎么办 警务通手机丢了怎么办 手机被伪基站覆盖怎么办 听了高频率声音怎么办 qq音乐签到没了怎么办 手机qq音乐不能播放怎么办 台式电脑放歌没有声音怎么办 微信图片上传大愎怎么办 行车记录仪内存卡丢了怎么办 投资项目失败lp的钱怎么办 无线网无ip分配怎么办 为什么电脑的暴风影音打不开怎么办 电枪充电板进水怎么办 捡到一颗子弹该怎么办 防弹衣只保护身体那手臂怎么办? 被子被宝宝尿湿怎么办 眼睛被子弹打了怎么办 gta5买了2套衣服怎么办 gta5车被摧毁了怎么办 gta5车被损坏了怎么办 头盔玻璃磨花了怎么办 浇花喷水壶坏了怎么办 电力专用光缆撞了怎么办 国防电缆挖断了怎么办 国防光缆挖断了怎么办 房门前乱挂光纤线影响住户怎么办