CodeForces
来源:互联网 发布:刷游戏的软件 编辑:程序博客网 时间:2024/05/21 12:50
题意
给出一个字符串 和每个字符的限制数量ai 让我们随意的切割成多个字符串 使得每一个字符串中的特定字符所在的子串长度len<=ai
求一共有多少个符合题目要求的方案 求其中最长的一个串长度是多少 求其中最少能分成多少个串
长度最大为1000
分析
明显可以用搜索 不过复杂度指数级 计数问题
考虑dp
对于第i个字符 他可以考虑从i-ai+1开始往后到i分割字符 我们这里可以枚举分割的位置
然后记录下来 那么对于第i个字符 我们知道他前面所有字符的分割数量 就可以更新第i个字符的分割方案 假设用dp[i]表示从1到第i个字符的可行分配方案 那么dp[i] +=dp[j]其中合法情况之和 就可以计数出所有情况的可能
code
#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<string>using namespace std;const int mod = 1e9+7;char a[1010];int dp[1010],mmin[1010],mmax,res[26];bool judge(int pos,int l){ for(int i=pos-l+1;i<=pos;i++){ if(res[a[i]-'a']<l)return 0; } return 1;}int main(){ int n; scanf("%d%s",&n,a+1); for(int i=0;i<26;i++)scanf("%d",&res[i]); dp[0]=1; for(int i=1;i<=n;i++){ mmin[i] = mod; for(int j=1;j<=i;j++){ if(judge(i,j)){//如果符合条件 就把方案数转移到更长的字符下 dp[i] = (dp[i]+dp[i-j])%mod; mmin[i] = min(mmin[i],mmin[i-j]+1);//两个dp变量 都要更新 这里就是要把段数一并更新 mmax = max(mmax,j); } } } printf("%d\n%d\n%d\n",dp[n],mmax,mmin[n]); return 0;}
阅读全文
0 0
- codeforces~~~
- Codeforces
- codeforces
- Codeforces
- codeforces
- codeforces
- Codeforces
- Codeforces
- CodeForces
- CodeForces
- CodeForces
- CodeForces
- CodeForces
- Codeforces
- Codeforces
- Codeforces
- Codeforces
- Codeforces
- 使用Mahout搭建推荐系统之入门篇2-玩转你的数据1
- 字符串函数—atoi()、itoa()等详解及实现(完整版)
- Construct2游戏2
- ElasticSearch Windows下安装
- 每天一个linux命令(27):linux chmod命令
- CodeForces
- sklearn决策树
- TestNG的基本注解
- Android开发小结——服务器通信
- 信息检索(IR)的评价指标介绍
- C2游戏制作进阶
- UltraEdit快捷键收集
- Linux文件目录操作基础指令
- 【LeetCode】105. Construct Binary Tree from Preorder and Inorder Traversal