题目链接

我用的比较传统的办法。。。单调队列优化了一下,写的有点搓,不管怎样过了。。。两个单调队列,存两个东西,预处理一个标记数组存。。。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <queue>
 5 #include <map>
 6 #include <ctime>
 7 #include <cmath>
 8 #include <algorithm>
 9 using namespace std;
10 #define INF 1000000
11 char str[200000];
12 int dp[200000];
13 int pre[200000];
14 int que1[200000];
15 int que2[200000];
16 int judge(char s)
17 {
18     if(s <= 'Z'&&s >= 'A')
19         return 1;
20     else if(s <= 'z'&&s >= 'a')
21         return 1;
22     else if(s == ' ')
23         return 1;
24     else
25         return 0;
26 }
27 int main()
28 {
29     int n,m,i,j,len,str1,end1,str2,end2;
30     scanf("%d%d%*c",&n,&m);
31     gets(str);
32     len = strlen(str);
33     for(i = 0; i < len; i ++)
34     {
35         if(judge(str[i]))
36         {
37             for(j = i; j < len; j ++)
38             {
39                 if(judge(str[j]))
40                 pre[j] = i;
41                 else
42                 {
43                     i = j;
44                     break;
45                 }
46             }
47             if(j == len) break;
48         }
49     }
50     for(i = 1;i <= len;i ++)
51     dp[i] = INF;
52     str1 = 0;end1 = 1;
53     str2 = 0;end2 = 1;
54     que1[0] = que2[0] = 0;
55     for(i = 1;i <= len;i ++)
56     {
57         dp[i] = dp[que1[str1]] + 1;
58         if(judge(str[i-1]))
59         {
60             if(str2 < end2)
61             dp[i] = min(dp[i],dp[que2[str2]]+1);
62         }
63         else
64         {
65             str2 = end2 = 0;
66         }
67         if(i == len) continue;
68         while(str1 < end1&&dp[i] <= dp[que1[end1-1]])
69         end1 --;
70         que1[end1++] = i;
71         while(str1 < end1&&i - que1[str1] >= n)
72         str1 ++;
73         if(judge(str[i]))
74         {
75             while(str2 < end2&&dp[i] <= dp[que2[end2-1]])
76             end2 --;
77             que2[end2++] = i;
78             while(str2 < end2&&que2[str2] < pre[i])
79             str2 ++;
80             while(i - que2[str2] >= m&&str2 < end2)
81             str2 ++;
82         }
83     }
84     printf("%d\n",dp[len]);
85     return 0;
86 }

转载于:https://www.cnblogs.com/naix-x/p/3315207.html

URAL 1427. SMS(DP+单调队列)相关推荐

  1. POJ 3017 DP + 单调队列 + 堆

    题意:给你一个长度为n的数列,你需要把这个数列分成几段,每段的和不超过m,问各段的最大值之和的最小值是多少? 思路:dp方程如下:设dp[i]为把前i个数分成合法的若干段最大值的最小值是多少.dp转移 ...

  2. 烽火传递(dp+单调队列)

    烽火台又称烽燧,是重要的军事防御设施,一般建在险要或交通要道上.一旦有敌情发生,白天燃烧柴草,通过浓烟表达信息:夜晚燃烧干柴,以火光传递军情,在某两座城市之间有 n 个烽火台,每个烽火台发出信号都有一 ...

  3. [DP/单调队列]BZOJ 2059 [Usaco2010 Nov]Buying Feed 购买饲料

    首先我想吐槽的是题目并没有表明数据范围... 这个题目 DP方程并不难表示. dp[i][j]表示前i个地点携带了j个货物的最小花费 dp[i][j] = dp[i-1][k] + (j-k) * c ...

  4. bzoj1791,P4381-[IOI2008]Island【基环树,树形dp,单调队列dp,树的直径】

    正题 评测记录:https://www.luogu.org/recordnew/lists?uid=52918&pid=P4381 题目大意 有n个岛,n条无向边(保证每个岛都有边连到).走过 ...

  5. bzoj2500幸福的道路 树形dp+单调队列

    2500: 幸福的道路 Time Limit: 20 Sec  Memory Limit: 256 MB Submit: 434  Solved: 170 [Submit][Status][Discu ...

  6. Codeforces Round #521 (Div. 3): F. Pictures with Kittens(DP+单调队列)

    题意: 你有n幅画,第i幅画的好看程度为ai,再给你两个数字k,x,表示你要从中选出刚好x幅画,并且相邻两幅画的距离不能≥k,好看程度之和最大能多少,选不出来输出-1,F1数据范围<200,F2 ...

  7. Codeforces 1077F2 Pictures with Kittens (hard version)(DP+单调队列优化)

    题目链接:Pictures with Kittens (hard version) 题意:给定n长度的数字序列ai,求从中选出x个满足任意k长度区间都至少有一个被选到的最大和. 题解:数据量5000, ...

  8. bzoj5185 [Usaco2018 Jan]Lifeguards(dp+单调队列优化)

    真是太神了orz 我们先贪心地把被包含的线段删掉,把剩下的线段按左端点排序,这样的话右端点显然也是有序的. 设dp[i][k],表示前i个线段,删了k个,且必须保留i线段的最大覆盖长度.枚举上一个线段 ...

  9. AcWing 1089 烽火传递 题解(动态规划—DP—单调队列优化DP)

    AcWing 1089 烽火传递 单调队列优化DP,思路比较简单,维护一个保持元素单调递增的单调队列,队首就是第i座烽火台能接收到的,代价最小的方案,加上第i座烽火台的代价就是这座烽火台的最小值 #i ...

最新文章

  1. Winforms-GePlugin-Control-library
  2. 【转载】SQL中使用update inner join和delete inner join
  3. [译]学习IPython进行交互式计算和数据可视化(四)
  4. Windows XP安装Python,最高支持到3.4.4,后续版本不支持
  5. 一起学nRF51xx 4 -  int
  6. linux redis 3.0.7,linux虚拟机上安装配置redis3.0.7
  7. linux 基本脚本编写
  8. 2019-06-02 15:27:20
  9. docker 基础操作
  10. 零基础转行学习python是否还在纠结?这里告诉你答案!
  11. 网页设计中 透明效果的使用技巧
  12. ES基础命令(参照mysql)
  13. 电影《长津湖》上映7天票房破26亿元
  14. SVN工作笔记002---svn提示上次操作有误,请执行cleanup
  15. extract()函数:用于从一个date或者interval类型中截取到特定的部分
  16. jquery双击修改_jQuery双击
  17. 基于JSP的网上订餐管理系统
  18. MRP里如何预测lead time :Approaches for the Prediction of Lead Times in an Engineer to Order Environment
  19. 多元统计分析及R语言建模(第四版)-----数据,包,资源
  20. apk多开制作方法 试用ApkEditor 1.8 旗舰版轻松制作apk多开双开

热门文章

  1. 单向环形列表及应用场景(约瑟夫环)
  2. 【译】Android中的安全数据-初始化向量
  3. 区块链学堂(6):以太坊生产网络/测试网络/私有网络
  4. Android Binder基本概念流程学习
  5. 【问链-区块链与生活】 第一课 你为什么又在熬夜?
  6. JZOJ 5850. 【NOIP提高组模拟2018.8.25】e
  7. 交换二维数组元素c语言,二维数组中元素替换问题!
  8. 计算机绘图cg,CG专业英语整理
  9. 矩阵相乘取共轭_正交矩阵学习小结
  10. 提高效率的几个软件和快捷键