正题

题目链接:https://ac.nowcoder.com/acm/contest/20110/C


题目大意

一个长度为nnn的字符串SSS,SSS中存在一些???,有N/O/I/PN/O/I/PN/O/I/P四个字符作为字符集,每对相邻的字符会产生不同的贡献,现在要求所有权值不小于xxx的字符串中字典序第kkk大的。

1≤n,k≤1000,1≤x≤1091\leq n,k\leq 1000,1\leq x\leq 10^91≤n,k≤1000,1≤x≤109


解题思路

考虑到暴力dfsdfsdfs搜索的瓶颈在于我们可能会搜到大量权值小于xxx的序列,所以如果保证我们每次都能搜到满足条件的字符我们就可以O(nk)O(nk)O(nk)解决这个问题。

可以设fi,jf_{i,j}fi,j​表示iii个字符是jjj开始往后最多能得到多少权值。

然后根据dpdpdp数组暴力dfsdfsdfs就好了。

时间复杂度:O(nk)O(nk)O(nk)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=1100;
ll n,l,k,w[4][4],f[N][4],a[N],c[N];
char s[N];
void dfs(ll x,ll p,ll sum){if((c[x]!=-1&&c[x]!=p)||sum+f[x][p]<l||!k)return;a[x]=p;if(x==n&&sum>=l){k--;if(!k){for(ll i=1;i<=n;i++){if(a[i]==0)putchar('N');if(a[i]==1)putchar('O');if(a[i]==2)putchar('I');if(a[i]==3)putchar('P');}putchar('\n');}return;}dfs(x+1,3,sum+w[p][3]);dfs(x+1,1,sum+w[p][1]);dfs(x+1,0,sum+w[p][0]);dfs(x+1,2,sum+w[p][2]);return;
}
signed main()
{scanf("%lld%lld%lld",&n,&l,&k);scanf("%s",s+1);for(ll i=1;i<=n;i++){if(s[i]=='N')c[i]=0;if(s[i]=='O')c[i]=1;if(s[i]=='I')c[i]=2;if(s[i]=='P')c[i]=3;if(s[i]=='?')c[i]=-1;}for(ll i=0;i<4;i++)for(ll j=0;j<4;j++)scanf("%lld",&w[i][j]);memset(f,0xcf,sizeof(f));for(ll i=0;i<4;i++)if(c[n]==-1||c[n]==i)f[n][i]=0;for(ll i=n-1;i>=1;i--)for(ll j=0;j<4;j++){if(!(c[i]==-1||c[i]==j))continue;for(ll k=0;k<4;k++)f[i][j]=max(f[i][j],f[i+1][k]+w[j][k]);}dfs(1,3,0);dfs(1,1,0);dfs(1,0,0);dfs(1,2,0);if(k)puts("-1");return 0;
}

2021牛客OI赛前集训营-提高组(第五场)C-第K排列【dp】相关推荐

  1. 2021牛客OI赛前集训营-提高组(第五场)D-牛牛的border【SAM】

    正题 题目链接:https://ac.nowcoder.com/acm/contest/20110/D 题目大意 求一个长度为nnn的字符串的所有子串的borderborderborder长度和. 1 ...

  2. 2021牛客OI赛前集训营-提高组(第四场) T2空间跳跃

    2021牛客OI赛前集训营-提高组(第四场) 题目大意 给你三个整数 n , d , l n,d,l n,d,l, n n n为正整数.负整数或0, d , l d,l d,l为正整数,你现在有一个数 ...

  3. 【2020牛客NOIP赛前集训营-提高组(第一场)题解】( 牛牛的方程式,牛牛的猜球游戏,牛牛的凑数游戏,牛牛的RPG游戏)

    未完待续... T1:牛牛的方程式 title solution code T2:牛牛的猜数游戏 title solution code T3:牛牛的凑数游戏 title solution code ...

  4. 2020牛客NOIP赛前集训营-提高组(第一场) T2 牛牛的猜球游戏

    题目链接: 牛客原站 通过记录: 题目链接2:T277380 牛牛的猜球游戏(被我们搬到洛谷力): 洛谷搬运 题目描述   有十个数 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ...

  5. 【2020牛客NOIP赛前集训营-提高组(第二场)】题解(GCD,包含,前缀,移动)

    文章目录 T1:GCD title solution code T2:包含 title solution code(正解code补充在上面了) T3:前缀 title solution code T4 ...

  6. 2020牛客NOIP赛前集训营-提高组(第三场)C-牛半仙的妹子Tree【虚树,最短路】

    正题 题目链接:https://ac.nowcoder.com/acm/contest/7609/C 题目大意 给出nnn个点的一棵树,mmm个时刻各有一个操作 标记一个点,每个点被标记后的每一个时刻 ...

  7. 2020牛客NOIP赛前集训营-提高组(第六场)A-袜子分配【组合数学,结论】

    正题 题目链接:https://ac.nowcoder.com/acm/contest/7615/A?&headNav=acm&headNav=acm 题目大意 nnn对颜色一样的袜子 ...

  8. 2020牛客NOIP赛前集训营提高组(第四场)B-色球【链表】

    正题 题目链接:https://ac.nowcoder.com/acm/contest/7611/B 题目大意 nnn个杯子,mmm个操作 在第zzz个杯子中依次加入xxx个颜色为yyy的球 在第yy ...

  9. 2020牛客NOIP赛前集训营-普及组第三场C牛半仙的妹子树

    链接:https://ac.nowcoder.com/acm/contest/7608/C 来源:牛客网 牛半仙有 n​ 个妹子,她们所在的位置组成一棵树,相邻两个妹子的距离为 1​. 有 m​ 个妹 ...

最新文章

  1. 汇编语言求无符号数组中出现的次数最多数_【今日最佳leecode通俗易懂】无重复字符的最长子串...
  2. C语言函数strstr()分析及实现
  3. matlab建模实例运筹学,matlab数学建模实例与编程教程
  4. 新技能get!判断盒子的实际大小及位置。。。
  5. [译文]c#扩展方法(Extension Method In C#)
  6. linux远程传文件scp和sftp详解
  7. WxMac BadgeLabels
  8. rvm 安装后的补充工作:source $HOME/.profile
  9. 使用 Pig 进行数据分析
  10. 数据结构上机实践第四周项目3 - 单链表应用
  11. WP7备注(11)(页面跳转)
  12. We7从这里开始---认识we7
  13. 大数据平台容量评估_如何评估组织的数据平台
  14. 蓝桥杯题目练习 提升篇 [蓝桥杯2018初赛]三体攻击
  15. Cosos H5开发工具箱(上)
  16. MySQL可视化工具HeidiSQL安装与使用
  17. 计算机测试的论文,计算机软件测试毕业论文(定稿).doc
  18. 华为云服务器如何登录
  19. Codeforces 1071C Triple Flips 构造
  20. 产品运营人员常用的5款软件,解决远程办公问题

热门文章

  1. angular的html引入js,在AngularJS中的文件夹中加载JavaScript和CSS文件
  2. java merge css_一句命令快速合并 JS、CSS
  3. java定时器写法_java定时器的写法是什么样?
  4. 超详细图解!【MySQL进阶篇】MySQL架构原理
  5. 遗传算法经典实例代码_经典算法研究系列 之 深入浅出遗传算法
  6. python类变量共享吗_第7.12节 可共享的Python类变量
  7. python怎么读数据库的数据_python从数据库读取出来的字典怎么更加方便的插入数据库...
  8. 用keil怎么擦除_分享STM32 FLASH 擦除(以及防止误擦除程序代码)、写入
  9. sqlserver 事务日志 异常增长原因排查_小白入门学习打日志
  10. mysql java驱动 ibm_JDBC驱动汇总