博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
URAL - 1427-SMS
阅读量:4652 次
发布时间:2019-06-09

本文共 1280 字,大约阅读时间需要 4 分钟。

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

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

 

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

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

 

#include
using namespace std;const int N=1e5+5;const int inf=0x3f3f3f3f;char s[N],g[3];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[0]=0; ans=inf; scanf("%d%d",&n,&m); gets(g); gets(s+1); int len=strlen(s+1); for(int i=0;i<=len;i++) { if(dp[i]==inf) continue; bool flag=true; int up=m; for(int j=1;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]+1); break; } else if(j>n && !flag) { int to=min(len,i+j-1); dp[to]=min(dp[to],dp[i]+1); break; } } if(up==m) dp[min(i+m,len)]=min(dp[min(i+m,len)],dp[i]+1); } //cout<
<
View Code

 

转载于:https://www.cnblogs.com/CJLHY/p/7580769.html

你可能感兴趣的文章
【XSY1841】Intervals
查看>>
Sublime Text 2 使用心得
查看>>
Django开发必知必会
查看>>
文件和二进制数据的操作
查看>>
静态链表
查看>>
Swift 之Carthage
查看>>
Java 反射机制
查看>>
Unity3D 原生Android结合UnityPlayerActivity开发遇到的问题
查看>>
表单元素及其格式
查看>>
洛谷 P2257 YY的GCD
查看>>
time模块
查看>>
Oracle Scheduler - Job and Argument
查看>>
同时update多张表的语句 -- 梦中的面试
查看>>
STM32f103C8T6 Bootloader设计(转)
查看>>
超声波测距温度补偿
查看>>
mysql级联删除
查看>>
面向对象(上)
查看>>
EFCodeFirst安装失败 解决规划
查看>>
各种域名解析的区别
查看>>
centos6.4搭建apache+mysql+php环境 ...
查看>>