Codeforces Round #642 (Div. 3)  参与排名人数11823

[codeforces 1353E]   K-periodic Garland   为什么会想到动归dp

总目录详见https://blog.csdn.net/mrcrack/article/details/103564004

在线测评地址http://codeforces.com/contest/1353/problem/E

Problem Lang Verdict Time Memory
E - K-periodic Garland GNU C++17 Accepted 46 ms 12400 KB

思路来自对数据的分析:

以n=4,k=2为例
有16种形态
0000符合题意
0001符合题意
0010符合题意
0011
0100符合题意
0101符合题意
0110
0111
1000符合题意
1001
1010符合题意
1011
1100
1101
1110
1111动归dp的目标不是枚举所有情况,而是符合题意的情况一个都不会漏,符合题意的形态有7种
0000
0001
0010
0100
0101
1000
1010通过对以下数据进行归纳,容易得出对应的动归dp的写法,对这7种形态,归类,找规律
1000注意,最后一个1,后面全是0
1010注意,最后一个1,后面全是0.(1010与1000有递推关系)
0100注意,最后一个1,后面全是0
0101注意,最后一个1,后面正好数据据终结.(0101与0100有递推关系)
0010注意,最后一个1,后面全是0
0001注意,最后一个1,后面正好数据据终结
0000注意,全是0考虑如下输入数据
4 2
11111111变换到0000,需变动4个数据
1111变换到1000,需变动3个数据
1111变换到1010,需变动2个数据
1111变换到0100,需变动3个数据
1111变换到0101,需变动2个数据
1111变换到0010,需变动3个数据
1111变换到0001,需变动3个数据取最小值2,
输出2通过上述过程可以看到:
0000可采用特判。
初始化为1000,0100,0010,0001这几种形态,
其它符合题意的形态都可以由初始化的形态推得。

根据上述数据分析,容易得到动归dp对应的算法如下:

dp[i]记录字串[1,i]区间满足题意的周期性质,第i位为必须为1,需要更新原字符串中的值的最小个数(1变0,记1次;0变1,记1次)

AC代码如下

#include <cstdio>
#include <algorithm>
#define maxn 1000010
using namespace std;
char s[maxn];
int sum[maxn],dp[maxn];//dp[i]记录字串[1,i]区间满足题意的周期性质,第i位为必须为1,需要更新原字符串中的值的最小个数(1变0,记1次;0变1,记1次)
int main(){int t,n,k,i,ans;scanf("%d",&t);while(t--){scanf("%d%d%s",&n,&k,s+1);for(i=1;i<=n;i++)sum[i]=sum[i-1]+s[i]-'0';//sum[]采用前缀和的方式记录字符串中1的个数for(i=1;i<=n;i++)dp[i]=sum[i-1]+(s[i]=='0');//处理字串[1,i]区间,目标(第i位为1,[1,i-1]全为0),字串需要变动的个数for(i=k+1;i<=n;i++)//要涉及起始位置,以及之后一个周期的k个数,故每次需处理连续的k+1个数dp[i]=min(dp[i],dp[i-k]+sum[i-1]-sum[i-k]+(s[i]=='0'));//dp[i-k]对应字串[1,i-k]区间满足题意的周期性质,第i-k位为必须为1,需要更新原字符串中的值的最小个数(1变0,记1次;0变1,记1次).sum[i-1]-sum[i-k]对应原字串区间[i-k+1,i-1]中1的个数.(s[i]=='0'),对应,第i位为必须为1,该位必须更新的次数。ans=sum[n];//对应更新后的字串全是0,需要更新的个数,即原字串中的1全部变更为0for(i=1;i<=n;i++)ans=min(ans,dp[i]+sum[n]-sum[i]);//请注意,区间[i+1,n]原字串的1全部变更为0.sum[n]-sum[i]对应原字串区间[i+1,n]中1的个数.printf("%d\n",ans);}return 0;
}

[codeforces 1353E] K-periodic Garland 为什么会想到动归dp相关推荐

  1. Codeforces Round #466 (Div. 2): E. Cashback(单调队列+DP)

    题目链接:http://codeforces.com/contest/940/problem/E 题意:给你一个长为n的序列和一个数字c,你要将这个序列切成若干段,对于每一段,这段中最小的[n/c]个 ...

  2. Codeforces 1088E Ehab and a component choosing problem(树形DP)

    Codeforces 1088E Ehab and a component choosing problem(树形DP) 题意 给一棵树,要求从中选一些联通分量,使得平均联通分量重量总和最大.如果有多 ...

  3. CodeForces - 1000D:Yet Another Problem On a Subsequence (DP+组合数)

    CodeForces - 1000D:Yet Another Problem On a Subsequence (DP+组合数) 题目大意:这题目啊,贼难理解- 定义一个数列是"好的&quo ...

  4. 787. K 站中转内最便宜的航班(dp)

    787. K 站中转内最便宜的航班(dp) D A G DAG DAG图直接开二维数组 d p dp dp. 令 d p ( i , j ) dp(i,j) dp(i,j)到达 i i i经过 j j ...

  5. K-periodic Garland CodeForces - 1353E(贪心)

    You are given a garland consisting of n lamps. States of the lamps are represented by the string s o ...

  6. K-periodic Garland CodeForces - 1353E(暴力+贪心+dp)

    题意: 给定长为 n 的 0, 1 字符串,你可以通过一次操作改变一个字符(0 变 1 or 1 变 0),问最少几次操作可以使任意相邻两个 1 之间的距离为 k ? 题目: You are give ...

  7. CodeForces - 1353E K-periodic Garland(思维+dp)

    题目链接:点击查看 题目大意:给出 n 个灯泡以及其初始状态(开或关),每次操作可以将任意一个灯泡的状态置反,问最少需要操作多少次,可以使得所有开着的灯泡之间相距 k 个单位 题目分析:因为需要满足所 ...

  8. Codeforces 986B. Petr and Permutations(没想到这道2250分的题这么简单,早知道就先做了)

    这题真的只能靠直觉了,我没法给出详细证明. 解题思路: 1.交换3n次或者7n+1次,一定会出现一个为奇数,另一个为偶数. 2.用最朴素的方法,将n个数字归位,计算交换次数. 3.判断交换次数是否与3 ...

  9. CodeForces - 140E New Year Garland (DP 计数)

    题意 用m种颜色的彩球装点n层的圣诞树.圣诞树的第i层恰由l[i]个彩球串成一行,且同一层内的相邻彩球颜色不同,同时相邻两层所使用彩球的颜色集合不同.求有多少种装点方案,答案对p取模. 题目链接 题解 ...

  10. Codeforces Beta Round #5 C. Longest Regular Bracket Sequence 栈/dp

    C. Longest Regular Bracket Sequence Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.c ...

最新文章

  1. foreach遍历打印表格
  2. hdu 3564(线段树+LIS)
  3. Addin and Automation Development In VB.NET 2003 (3)
  4. MFC中动态创建button及添加响应事件
  5. 韩国首尔公交车站将被指定为禁烟场所
  6. linux 内核3.8,[Beaglebone] BBB迁移到linux 3.8实时内核
  7. 【JAVA基础篇】枚举
  8. vue.js建立主页的路由 - 另类的实现方式
  9. WDK10+VS2015 驱动环境搭建
  10. 禅道报表中关闭bug统计图_如何生成动态统计图,这款BI教你定义炫酷
  11. exception(359): error C2220: 警告被视为错误 - 没有生成“object”文件
  12. mac安装虚拟机 centos7
  13. 如何克隆LINUX硬盘:4种方法
  14. 汉洛塔hanoi递归问题
  15. 2018世界杯赛程表
  16. 1-1/2+1/3-1/4+.........+1/99-1/100
  17. Pandas处理表格基础
  18. solution的一知半解
  19. html5 plus.push,HTML5+规范:Push(管理推送消息功能)
  20. 恋与抽卡模拟器网页_恋与制作人抽卡模拟器怎么用 模拟器使用说明

热门文章

  1. 国内网络游戏开发技术现状和趋势
  2. 不懂这些法律问题,你的创业融资很危险
  3. L1, L2以及smooth L1 loss
  4. 为什么阿里,腾讯,百度和京东都是在开曼岛注册的?
  5. eMule电驴使用从入门到精通
  6. Python.习题八 文件与与异常(上)
  7. 上古卷轴5传奇版LE与重制版SE的区别(LE Vs SE)
  8. json编辑器插件 vue_基于vue平台的json schema 编辑器
  9. 使用Mybaties xml的增删改查
  10. 深度学习对抗鲁棒性基础