题意:雪雪是一只猴子.它在每天的 2:00 —— 9:00之间非常渴,所以在这个期间它必须喝掉2个单位的水.它可以多次喝水,只要它喝水的总量是2.它从不多喝,在一小时内他只能喝一个单位的水.所以它喝水的时间段可能是2:00 ——4:00,或者3:00——5:00,或者7:00——9:00.甚至喝两次,第一次2:00——3:00,第二次8:00——9:00.但是它不能在1:00——3:00喝水,因为在1:00时它不渴,也不能在8:00——10:00喝水,因为9:00必须结束.一共有n(n <= 1…
题目大意:有n只猴子,每只猴子都有一组参数(v,a,b),表示这只猴子在时间段[a,b]之间必须要喝v个单位水,并且每个时间单位只能和一个单位水,每次至少喝一个单位.但是只有一个水池,并且这个水池最多只允许m只猴子同时喝水.问能否满足所有的猴子喝水,若能,输出任意一种可行的方案. 题目分析:将每个猴子和每个喝水区间视作节点.将每只猴子向它对应的区间连弧,容量为该区间上能喝水的总单位数:从源点向每只猴子建弧,容量为对应猴子的总需求量:从每个区间向汇点建弧,容量为该区间单位长度乘以m,表示在该区间最…
题目大概说有n只猴子,猴子们在某个时间段需要喝vi时间的水,各个单位时间段最多允许m只猴子同时喝水,问猴子们能否成功喝水并输出一个可行的方案,输出方案的时间段区间要从小到大排序并且合并连续的区间. 首先应该能联想到这是最大流的模型.猴子有100只,不过区间的点达到50W,这时考虑离散化,离散化后最多就200个点也就是199个区间. 于是猴子与区间可以作为容量网络的点,新建源点和汇点. 源点向猴子连容量vi的边,区间向汇点连容量为区间包含单位时间段数*m的边. 各个猴子喝水时间段包含的区间,由猴子…
这道题写了两个多小时-- 首先讲一下怎么建模 我们的目的是让所有点的出度等于入度 那么我们可以把点分为两部分, 一部分出度大于入度, 一部分入度大于出度 那么显然, 按照书里的思路,将边方向后,就相当于从出度大于入度的运一个流量到 入度大于出度的点. 紫书 例题 11-13 UVa 10735(混合图的欧拉回路)(最大流) 所以我们可以把源点S到所有出度大于入度的点连一条弧, 弧的容量是出度-入度的一半 为什么容量是这样呢,等一下说 同理, 把所有入度大于出度的点和汇点T连一条弧, 弧的容量是入…
题意:给定两个数m, n,求从 m 到 n 中0-9数字各出现了多少次. 析:看起来挺简单的,其实并不好做,因为有容易想乱了.主要思路应该是这样的,分区间计数,先从个位进行计,一步一步的计算过来.都从0开始,最后用大数减小数的即可. 举个例子吧,容易理解.比如0-1234. 先计算个位数字,有1-4,然后计算123各出现了5次,注意是这里是5次,不是4次,因为我们要加上那个0,然后就剩下那个1230了,我们想那么现在个位数从开始到这, 重复了123次,然后再进行下一位,依次进行,直到0. 代码如…
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2631 题目大意: 给一个字符串, 要求把它分割成若干个子串,使得每个子串都是回文串.问最少可以分割成多少个. 分析: f[i]表示以i结尾的串最少可以分割的串数. f[i] = min{ f[j]+1, 串[j,i]是回文串&&1<=j<=i } #i…
区间dp,两个str一起考虑很难转移. 看了别人题解以后才知道是做两次dp. dp1.str1最坏情况下和str2完全不相同,相当于从空白串开始刷. 对于一个区间,有两种刷法,一起刷,或者分开来刷. 规定[i][i-1]为空串,这样一起刷可以归结为第二种情况. 合并的时候,大的区间的次数<=小的区间的,和新加入区间的字符有关. 小的区间是一个字符一个字符的变成大区间的. 所以每次考虑新加入区间的尾部字符j,枚举k划分区间[i][k-1],[k][j]. 要使得刷的次数减少,只有尽量一起刷.比如a…
区间dp,切割dp[i][j]的花费和切法无关(无后效性) dp[i][j]表示区间i,j的花费,于是只要枚举切割方法就行了,区间就划分成更小的区间了.O(n^3) 四边形不等式尚待学习 #include<bits/stdc++.h> //变量不要取成ignore left之类 using namespace std; ; int cut[maxn]; int dp[maxn][maxn]; const int INF = 0x3fffffff; int main() { //freopen(…
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=105116#problem/E 题意:添加最少的括号,让每个括号都能匹配并输出 分析:dp[i][j]表示第i个到第j个需要添加的最少的括号,pos[i][j] = k;表示i到j间第k个需要加括号: 如果str[i]和str[j]匹配,那么dp[i][j] = max(dp[i + 1][j - 1], dp[i][j]); 如果str[i]和str[j]不匹配,那么dp[i][j]…
题目 传送门:QWQ 分析 大力dp.用$ dp[i][j] $表示$ [i,j] $A能得到的最高分 我看到博弈论就怂... 代码 #include <bits/stdc++.h> using namespace std; ; int S[maxn],A[maxn],vis[maxn][maxn],n,d[maxn][maxn]; int dp(int i,int j){ if(vis[i][j]) return d[i][j]; vis[i][j]=; ; ;k<=j;k++) m=…