随笔分类 -  动态规划

摘要:/* 空间32000 我写的全都31900+ 醉了 可以降维优化空间的 状态:f[i][j] 前i个题目a一共做了j分钟 b最少的做题时间 转移:考虑每个题目给谁做 f[i][j] = min ( f[i-1][j-a]a做 , f[i-1][j]+b b做); 最后对于f[n]枚举a的做题时间 更新答案 */ #include #include #include #define max... 阅读全文
posted @ 2016-07-09 20:29 一入OI深似海 阅读(156) 评论(0) 推荐(0)
摘要:/* 根据中序遍历的性质 加上子树的类似递归处理 嗯 是个石子归并 然而边界老写不对 还有循环顺序 一气之下写了记忆化.... 几下每个区间的最优值由那个点分开 即子树的根是谁 然后递归输出来 注意先递左子树 后递右子树 */ #include #include #include #define maxn 35 using namespace std; int n,f[maxn][maxn]... 阅读全文
posted @ 2016-07-05 19:27 一入OI深似海 阅读(132) 评论(0) 推荐(0)
摘要:#include #include #include using namespace std; int f[27][11],l,ans; char s[11]; void Get_f() { for(int i=1;i #include #include #define maxn 100010 using namespace std; int T,n; long long s[maxn+... 阅读全文
posted @ 2016-07-05 14:42 一入OI深似海 阅读(157) 评论(0) 推荐(0)
摘要:/* 没想到还有dp的事 只能水部分分了 前几个点可以水过 4,5暴力也可以 先每个临湖点都灌一下水 (可以加剪枝 比旁边小的可以不搜) 统计每个临湖点能灌倒几个临沙漠点 并记录每个临沙漠点是否能灌倒 这样前三个点就好办了 判断可以输出不能全灌到的点 对于剩下的全部能灌倒得 暴力的话是2^n 也就水两个点了 这里如果全部能灌倒 有一个很有用的性质 : 这时每个临水点能灌到的临沙漠点 一定是相邻的... 阅读全文
posted @ 2016-07-04 19:46 一入OI深似海 阅读(200) 评论(0) 推荐(0)
摘要:/* 中国的题目 ——贱买贵卖 0.0 这题wa了好多遍 第一遍看着题 哎呀这不很简单嘛 从起点能到的点都是合法的点 然后统计合法的点里最大最小值 然后printf 也不知道哪里来的自信 就这么交了 然后爆零了 第二遍想了想 恩 刚开始思路有问题 必须先买后卖 买的点要在卖的前面 恩 很有道理 然后数组模拟着统计了一下i之前的最小值和i之后的最大值 并且确保每个点都是合法的 然后 连样例都不对... 阅读全文
posted @ 2016-07-02 18:44 一入OI深似海 阅读(202) 评论(0) 推荐(0)
摘要:/* 粘一下开始写的暴力吧 虽然没啥价值 */ #include #include #include #include #define maxn 100010 using namespace std; int n,type[maxn]; double k,c,w,v[maxn],ans; void Dfs(int p,double t,double m) { if(p==n+1) ... 阅读全文
posted @ 2016-06-19 15:57 一入OI深似海 阅读(193) 评论(0) 推荐(0)
摘要:/* 开始没啥好的思路 暴力吧 T的太严重 加了k>n的特判 结果没数据…..然后又暴力生成了几组答案 打表 然而有没有数据 华丽的爆零了 正解 回溯+DP 回溯生成k数组 然后DP找最优解更新 */ #include #include #include using namespace std; int n,k,f[550],a[55],ans[55],Ans; void Judge()/... 阅读全文
posted @ 2016-06-07 20:05 一入OI深似海 阅读(245) 评论(1) 推荐(0)
摘要:/* 下标字典序最小 */ #include #include #include #define maxn 10010 using namespace std; int n,a[maxn],f[maxn],pre[maxn],len=1,k=1,ans[maxn],size; int main() { //freopen("maxxl.in","r",stdin); //fre... 阅读全文
posted @ 2016-06-06 11:33 一入OI深似海 阅读(499) 评论(4) 推荐(1)
摘要:/* 要求每个最优 即累加前k优解 注意不用去重 */ #include #include #include #define maxn 210 #define maxm 5010 #define maxk 60 using namespace std; int n,m,k,w[maxn],v[maxn],f[maxm][maxk]; int x[maxk],y[maxk],a,b,z,ans;... 阅读全文
posted @ 2016-06-06 08:44 一入OI深似海 阅读(144) 评论(0) 推荐(0)
摘要:/* 01背包第k优解问题 f[i][j][k] 前i个物品体积为j的第k优解 对于每次的ij状态 记下之前的两种状态 i-1 j-w[i] (选i) i-1 j (不选i) 分别k个 然后归并排序并且去重生成ij状态的前k优解 */ #include #include #include #define maxn 1010 using namespace std; int T,n,m,k,c... 阅读全文
posted @ 2016-06-06 08:43 一入OI深似海 阅读(268) 评论(0) 推荐(1)
摘要:/* 做的不多的位数dp 暴力的话 不知道多少组数据 会T 所以写dp 思路就和数学课本上那种“不超过xxx的x位偶数有几个” 这里可以类似的维护一个前缀和模样的东西(但又不同于前缀和) 状态:f[i][j] 表示以j开头的i位数符合条件的个数 (j可以是0) 然后可以已处理一下像是10000这种整的数 注意舍去不符合条件的 然后对于一个像123456这样不整的数 就从该高位逐位找 以此类推... 阅读全文
posted @ 2016-05-16 18:15 一入OI深似海 阅读(237) 评论(0) 推荐(0)
摘要:/* dp 如果是统计最少加多少个括号 就是区间dp 如果区间两头是匹配的 就可以用 i+1 j-1 更新 然而这题要输出方案 就类似记路径 记背包选哪几个一样 维护一个bj表示 i到j的最优解是由 分成哪两份转移来的 如果无法分 就是-1 最后递归搞输出方案 递归终点就是需要改变的点 */ #include #include #include using names... 阅读全文
posted @ 2016-05-15 18:29 一入OI深似海 阅读(150) 评论(0) 推荐(0)
摘要:/* n*n的算法 比较容易想到 特判的好cena的 70分 */ #include #include #include using namespace std; int a[40005],f[40005]; int main() { //freopen("cleanup.in","r",stdin); //freopen("cleanup.out","w",stdout)... 阅读全文
posted @ 2016-05-08 16:03 一入OI深似海 阅读(214) 评论(0) 推荐(0)
摘要:/* 一开始认为是个水题 直接模拟 没想到只得了50分 一看数据吓niao了 模拟妥妥的TLE 实在不好优化了0.0(最快O(m)) 然后借鉴别人的 DP+神奇的输出 DP:状态:f[i][j] 前i个字符出现j次1的数字个数 很容易想到 如果i是1 f[i][j]=f[i][j]+f[i-1][j-1] 如果i是0 f[i][j]=f[i][j]+f[i-1][j] 初始化 i==... 阅读全文
posted @ 2016-04-25 16:43 一入OI深似海 阅读(189) 评论(0) 推荐(0)
摘要:/* 状态:f[i][j] 前i个村庄已经建了j个学校 转移:f[i][j]=min(f[i][j],f[ii][j-1]+s[ii+1][i]) 1 #include #include #include #include using namespace std; int n,m,a[505],h[505],s[505][505],f[505][505],ans; int Dfs(int nn... 阅读全文
posted @ 2016-04-23 16:29 一入OI深似海 阅读(253) 评论(0) 推荐(0)
摘要:/* 因为m为连续放的个数 所以状态要包括这个条件 定义状态:f[n][m]表示第n个坑连续放了m个 转移:分两种 1. 第x个坑 放 即m>=1 则 f[x][k]=f[x-1][k-1] 2. 第x个坑 不放 即m==0 则 f[x][k]=Σf[x-1][i] 最后sum一下 f[n][i] */ #include #include using namespace std; long ... 阅读全文
posted @ 2016-04-23 16:09 一入OI深似海 阅读(277) 评论(0) 推荐(0)
摘要:/* 双向DP 两条路 f[i][j] 表示第一条路末位置为i 第二条路末位置为j 的最优解 转移:对于下一个点 k=max(i,j)+1 可以更新 路1的末位置 也可以更新路2的末位置 f[i][k]=min(f[i][k],f[i][j]+dis[j][k])路2 f[k][j]=min(f[k][j],f[i][j]+dis[i][k])路1 最后 点n 可能属于路1 也可能属于路2... 阅读全文
posted @ 2016-04-20 15:32 一入OI深似海 阅读(203) 评论(0) 推荐(0)
摘要:/* 假设当前有a个A b个B c个C 用 f[a][b][c]来表示 那么如果这个串以A结尾 那就是 f[a-1][b][c]转移来的 所以构成 f[a][b][c]的串一定有一部分是 f[a-1][b][c] 同理 B C 所以: f[a][b][c] = f[a-1][b][c]+f[a][b-1][c]+f[a][b][c-1] 至于题目里那个什么前缀什么规则 既然f[1][1][... 阅读全文
posted @ 2016-04-20 15:31 一入OI深似海 阅读(236) 评论(0) 推荐(0)