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