题目大意:给你长度为n的字符串(n<=1e6),让你对它进行划分,如果一段里面只有字母和

空格可以包含m(m<=1e5)个,如果有其他字符只能包含n个,问你最少需要分成几段。

思路:划分dp,dp[ i ] 表示以i为结束最少需要分成多少段,复杂度n*m,不能接受,我们考虑贪心

每次划分使其中包含的字符尽可能多,如果dp[ i ]没有赋值则直接跳过。

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+;
const int inf=0x3f3f3f3f;
char s[N],g[];
int n,m,dp[N],ans;
bool p[N];
bool judge(char x)
{
if(x>='a' && x<='z') return true;
if(x>='A' && x<='Z') return true;
if(x==' ') return true;
return false;
}
int main()
{
memset(dp,inf,sizeof(dp));
dp[]=;
ans=inf;
scanf("%d%d",&n,&m);
gets(g);
gets(s+);
int len=strlen(s+);
for(int i=;i<=len;i++)
{
if(dp[i]==inf) continue;
bool flag=true;
int up=m;
for(int j=;j+i<=len && j<=m;j++)
{
if(!judge(s[i+j])) flag=false,up=n;
if(j<=n && !flag)
{
int to=min(len,i+n);
dp[to]=min(dp[to],dp[i]+);
break;
}
else if(j>n && !flag)
{
int to=min(len,i+j-);
dp[to]=min(dp[to],dp[i]+);
break;
}
}
if(up==m) dp[min(i+m,len)]=min(dp[min(i+m,len)],dp[i]+);
}
//cout<<dp[3]<<endl;
printf("%d\n",dp[len]);
return ;
}

最新文章

  1. 使用VS Code开发ASP.NET 5 应用程序
  2. Map工具系列-02-数据迁移工具使用说明
  3. Arcgis 10.1安装
  4. Unity 之 Shader 对Z深度的偏移
  5. 海量数据导入MySQL的注意事项
  6. MyEclipse+Struts+Hibernate+Mysql开发环境配置
  7. 153. Find Minimum in Rotated Sorted Array
  8. 第十篇、HTML5实战篇——1
  9. dfs 生成排列和组合
  10. js获取当前的时间(包含星期)
  11. MVC4 + EF + System.Threading.Thread 出现的问题记录
  12. Springmvc+Spring+Hibernate搭建方法
  13. Ubuntu加上一个命令搜索路径/etc/ environment
  14. Docker Swarm 中最重要的概念- 每天5分钟玩转 Docker 容器技术(94)
  15. TED - How To Get Better At The Things You Care About
  16. jQuery live()方法使用及变更(事件委托)
  17. Git(管理修改)
  18. 经典的HTML5游戏及其源码分析
  19. OpenGL——旋转的六边形(动画)
  20. 关于xampp默认安装后mysql/mariadb密码的修改

热门文章

  1. 使用java.util.LinkedList模拟实现内存页面置换算法--LRU算法
  2. python中enumerate()的用法
  3. 利用 python requests完成接口文件上传
  4. python - logging模块应用
  5. Activity,Fragment的状态保存
  6. JSON和JSONP的区别,以及使用方法
  7. ubuntu14.04 安装 openssh-server
  8. 【API】API函数创建用户,添加到管理组
  9. Anaconda3配置环境变量
  10. ES系列十七、logback+ELK日志搭建