摘要: 坑,一开始以为,分成两半的时候去最大那个就行了,实际上这样是不对的,因为有可能出现小的一半的时间比大的要长,因为还和等待次数有关,且转移的时候需要用到次数更小的状态,所以状态定义为二维,dp[i][j]表示长度为i的区间,放小于等于j次的概率。要求确切的某次的概率,比如k,就只要用dp[i][k]-... 阅读全文
posted @ 2015-08-13 22:02 陈瑞宇 阅读(366) 评论(0) 推荐(0) 编辑
摘要: 首先是一个贪心,一种灯泡要么全都换,要么全都不换。先排序,定义状态d[i]为前面i种灯泡的最小花费,状态转移就是从d[j],jusing namespace std;const int maxn = 1e3+3;int V[maxn], K[maxn], C[maxn], L[maxn];int d... 阅读全文
posted @ 2015-08-13 11:24 陈瑞宇 阅读(229) 评论(0) 推荐(0) 编辑
摘要: d[i]表示前面i个字符划分成的最小回文串个数,转移:当第i字符加进来和前面区间j构成回文串,那么d[i] = d[j]+1。要判断前面的字符j+1到i是不是回文串,可以用Manacher算法预处理出来。(其实O(n^2)判断回文串的也可以,时间复杂度不会变,只是为了学习ManacherManach... 阅读全文
posted @ 2015-08-13 11:21 陈瑞宇 阅读(248) 评论(0) 推荐(0) 编辑
摘要: 每首只能唱一次,而且中间不能不唱歌,所以先把状态赋值为-1,以区别合法状态和非法状态,在唱歌曲目最多的条件下,离开时间应该尽量晚。状态定义f[i][j]考虑前i首歌唱歌时间为j的最大唱歌曲目#includeusing namespace std;const int maxn = 55;const i... 阅读全文
posted @ 2015-08-13 10:48 陈瑞宇 阅读(210) 评论(0) 推荐(0) 编辑
摘要: 分阶段的DAG,注意字典序的处理和路径的保存。定义状态d[i][j]为从i,j 出发到最后一列的最小花费,转移的时候只有三种,向上,向下,或平移。#includeusing namespace std;const int maxm = 11;const int maxn = 101;int G[ma... 阅读全文
posted @ 2015-08-13 10:44 陈瑞宇 阅读(385) 评论(0) 推荐(0) 编辑