随笔分类 - 动态规划
摘要:贪心+优先队列#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
const int maxn=50;
int h[maxn],n;
int main()
{ int tot=0; while(cin>>n&&n) { tot++; int i; priority_queue<int> q1; priority_queue<int,vector<int>,
阅读全文
摘要:这道题让我新认识到的是,做dp题,不一定非得找到具体的某一个最优子结构,可以美剧所有可能子结构的最优解,通过比较得到结果。向此题,只要找到和子结构之间的关系,然后选取最大的,之前一直死去想最有子结构,后来看了黑书。发现lrj所说,只是去找子问题中的最优解。还有就是数据中有空字符串,要注意#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=110;
const int inf=1<<30;
char s[maxn];
阅读全文
摘要://读了半大天题终于发现就是LIS问题
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn=100000;
const int inf=1<<30;
int s[maxn],r[maxn],d[maxn],g[maxn];
int n;
int low_bound(int x)
{ int high=n,low=0,mid; while(high-low>0) { mid=low+(high-low)/2; if(g[mid]>=x) high=mid
阅读全文
摘要:dp,LCS的应用//求出输入的字符串和他的回文串的LCS的长度l,用此字符串的长度n-l,即得结果
//还有存储的问题,如果用f[maxn][maxn]存储的话会超内存,可通过滚动数组优化
//因为求当前f[i][j]时可能会用到f[i-1][j-1],f[i-1][j],f[i][j-1],观察发现i,j
//只用到当前的i,i-1,二者可用奇偶性区分,只需用一个f[i%2][j]就可表示,为什么
//不能用f[i][j%2]表示,可通过判定求当前的f[i][j%2]时,f[i-1][j%2]并不是f[i-1][j]
//所以这样做是错误的,但前者却可以通过类似的方法判是正确的,所以只需f
阅读全文
摘要:dp ,经典LCS,你懂的,不解释//dp 经典的LCS问题。对于s1,s2,如果c(s1)=c(s2),则f(s1,s2)=f(s1-1,s2-1,)+1,如果c(s2)!=c(s1),则
//f(s1,s2)=max{f(s1-1,s2),f(s1,s2-1)},边界是f(s1,0)=0,f(0,s2)=0; #include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=1000;
const int inf=1<<31
阅读全文
摘要:dp,详细说明在代码中//在最优解中,一个邮局肯定分管了一部分的村庄,那么通过枚举最后一个邮局所分管的范围,(由于坐标上的n个点,
//离这N个点距离之和最短的点一定是这些点的个数的中位数,如果N为偶数,那么这个点一定在包含中位数的区间整个范围内
//包括边界点)通过最后一个邮局的分管范围可确定最后一个邮局的位置,并且可得最后一个邮局所分管的村庄到这个邮局的最短距离之和,
//就可得到到状态转移方程:
// f(i,j)=min{f(i,k-1)+sum(k,j)}(i=<k<=j),其中f(i,j)表示总共i个邮局分管村庄1——j,sum表示最后一个邮局的所分管范围
// 的距离
阅读全文

浙公网安备 33010602011771号