Ural 1427
来源:互联网 发布:英特尔双核处理器优化 编辑:程序博客网 时间:2024/06/05 22:52
PRO IS HERE
描述:将一段文本分成最少的几段,全是由空格和字母组成的最长可拥有m个字符,否则最多含n个字符。
求最少的段数。
我们假设第一种方案是只存储空格和字母,第二种方案为其他。
DP : dp[i][0] 表示到i这个点且这个点用的是第一种方案的最少的切段。
dp[i][1] 表示。。。。。。。。。。。。第二种方案。。。。。
然后就可以了。
#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<vector>#include<set>#include<queue>#include<map>using namespace std;#define FOR(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)#define DOR(i,a,b) for(int (i)=(a);(i)>=(b);(i)--)#define bug puts("Fuck");#define LL long long#define pb push_back#define mp make_pair#define nMax 101000#define eps 1e-8#define inf 0x7fffffffchar s[nMax];int n,m;int l[nMax],dp[nMax][2];int in(char ch){return ch==' ' || (ch>='a' && ch<='z') || (ch>='A'&&ch<='Z') ;}void sovle(){l[0]=0;s[0]='.';for(int i=1;s[i];i++) if(in(s[i])){l[i]=l[i-1];}else l[i]=i;dp[0][0]=dp[0][1]=0;int i;for(i=1;s[i];i++) {int j=i-n;if(j<=0) j=0;dp[i][0] = min(dp[j][0],dp[j][1]) + 1;if(in(s[i])) {int j = l[i];if(i-m > j) j=i-m;dp[i][1] = min(dp[j][0],dp[j][1]) + 1;}else dp[i][1] = inf;//printf("%d %d %d \n",i,dp[i][0],dp[i][1]);}int ans = min(dp[i-1][0],dp[i-1][1]);printf("%d\n",ans);}int main(){#ifndef ONLINE_JUDGEfreopen("input.txt","r",stdin);//freopen("output.txt","w",stdout);#endifwhile(~scanf("%d%d",&n,&m)){gets(s);gets(s+1);sovle();}return 0;}
- Ural 1427
- URAL
- 【ural】
- URAL
- URAL
- URAL
- URAL
- URAL
- URAL
- URAL
- URAL
- URAL
- URAL
- URAL
- URAL
- URAL
- URAL
- URAL
- nginx源码分析—队列结构ngx_queue_t
- POJ 2585 Window Pains (拓扑排序)
- 根据年月日算出是星期几
- 《精通Oracle10gPLSQL编程》11、开发子程序
- 2012 Maryland High School Battleground Preservation map容器+Floyd
- Ural 1427
- 日语训读
- Canopen通讯规范DS301_V4.02学习研究——前6章基础知识
- 《精通Oracle10gPLSQL编程》12、开发包
- 滑动菜单 SlidingMenu (转载)
- Install GNOME development environment on Ubuntu
- poj 3982- 序列-大整数加法
- session sniffer
- pwsniffer