dp
文章平均质量分 72
Benzema67
北京邮电大学学生
展开
-
HDU 4049
好题mark1. 图论方法(最大权闭合子图)#include #include #define min(a,b) ((a)<(b)?(a):(b)) const int N=1110;const int E=5000;const int oo=1000000000; int node,src,dest,ne;int head[N],work[N],Q[N],dist[N]原创 2014-10-22 17:09:23 · 1416 阅读 · 0 评论 -
zoj 3397
这是一道Hanio Tower的变形题要按绩点从低到高处理:如果他已在目标位置,那么不动;如果他要从计算机(数学)到中文,或者从中文到计算机(数学),那么首先把绩点更高的人移到数学(计算机),这部分递归做,然后实现转系;如果他要从计算机(数学)到数学(计算机),那么就相当于先做从计算机(数学)到中文,再做从中文到数学(计算机);#include #include原创 2013-04-05 20:36:45 · 1259 阅读 · 0 评论 -
zoj 2338
HanioTower的加强版记f[n][m]为n个disc,m个peg的Hanoi问题,则有dp公式f[n][m]=min{f[n-k][m-1]+2*f[k][m]}。即把上面的k个disc利用m个peg转移某个中间peg,再把下面的n-k个disc利用m-1个peg转移到目标peg,最后把上面的k个disc利用m个peg移到目标peg。dp过程记下使得f[n][m]最小的g[n][m]原创 2013-04-05 20:39:10 · 1414 阅读 · 0 评论 -
UVA 12452
简单树形DP昨天做这道题一直RE,最后在队友帮助下手写栈过了今天再看昨天的代码,发现自己确实写搓了,在每次dfs中都要开10000的数组不爆才怪.....换种写法就可以了代码能力太渣没办法,继续加油!#include#include#include#include#include#include#include#include#include#include#i原创 2013-03-29 12:37:54 · 1060 阅读 · 0 评论 -
HDU 4455
参考http://www.cnblogs.com/kuangbin/archive/2012/11/11/2765329.html#include #include #include #define N 1000100typedef long long ll;using namespace std; //这里理解a[0]与所以数都相等,利于后面递推in原创 2013-02-28 18:25:08 · 1160 阅读 · 0 评论 -
TC SRM 557 DIV2 1000
比较好的dp当k=m时,dp[i][j][m]记录走i位字符串上目前和为j且目标串是目前字符串的字串的个数为k当k!=m时,dp[i][j][k]记录走i位字符串上目前和为j且后缀和目标串匹配的个数为k的个数而e[i][0]表示目标串的前i位+‘U’ 后缀匹配目标串的最大长度e[i][1]同理类似。// BEGIN CUT HERE// END CUT HER原创 2012-10-13 22:47:03 · 1197 阅读 · 2 评论 -
HDU 4383
区间DP好题#include#include#include#define inf 100000000using namespace std;int num[110],sum[110],dp[110][110];int main(){ int t,T,n; int l,i,j,k; scanf("%d",&T); for(t=1;t<=T;t++){原创 2012-09-14 20:19:22 · 796 阅读 · 0 评论 -
HDU 4323
字符串的编辑距离#include#include#include#define inf 100000000using namespace std;int num[110],sum[110],dp[110][110];#include#include#include#include#includeusing namespace std;string str1[1510]原创 2012-09-14 21:09:09 · 753 阅读 · 0 评论 -
hdu 4055
不错的dplong long 果然比int慢好多#include#include#include#include#include#define N 1010#define mod 1000000007using namespace std;typedef long long ll;int sum[N][N];char s[1010];int main(){原创 2012-10-04 21:18:57 · 1413 阅读 · 3 评论 -
SPOJ BTCODE_H
dp[i][j]前一维是串的个数,后一维是串的长度下面代码是队友写的,感觉好神#include#include#includeconst int MAX = 300, MAXN = MAX+5;int T, N, L;double c[MAXN][MAXN], d[MAXN][MAXN];using namespace std;int main(){ c[0][0] =原创 2013-03-24 00:00:33 · 1086 阅读 · 0 评论 -
HDU 4433
这个题我做的时候yy各种贪心,结果一直WA可能是情况考虑不全吧,今天生成了些数据,发现贪心果然好多漏洞,比如我就挂这组test:0000 5467改成暴力枚举就过了#include #include #include #include #include #include using namespace std;char s1[1100],s2[1100];int s原创 2013-04-07 22:47:56 · 1177 阅读 · 0 评论 -
UVALive 6208
离散DP由于状态转移需要记录三维,第三维是之前的高度,而这个变量取值只有离散的几个,故用map来存。不过一开始一直T啊,最后加些剪枝终于过了。。。#include #include #include #include #include #include using namespace std;const int inf =((~(0U))>>1);struct Poin原创 2013-04-15 00:41:01 · 1161 阅读 · 0 评论 -
HDU 4271
字符串的编辑距离的扩展//f[i,j]表示s[0...i]与t[0...j]的最小编辑距离。 f[i,j] = min { f[i-1,j]+1, f[i,j-1]+1, f[i-1,j-1]+(s[i]==t[j]?0:1) } f[i-1,j]表示将s[i]删去,剩下是s[0...i-1]与t[0...j]的最小编辑距离;f[i][j-1]表示在s[i]后面原创 2012-09-15 14:49:58 · 999 阅读 · 0 评论 -
经典状态dp题目
POJ 1185 炮兵阵地一般这类题目列会很小10左右,我们需要枚举所有行,对于当前行,其放炮的位置只与上一行和上上行有关,我们记当前行状态和上一行状态便可转移了,dp数组开3维即可。在枚举每一行放炮兵的方法时,可以预处理方便获得所有可能放法。具体细节见代码。总体复杂度O(Row*70*70*70),70是预处理得到的每一行最多放法。打表很容易看出来。#include#inclu原创 2014-01-29 19:51:09 · 3843 阅读 · 0 评论 -
POJ 2152
陈启峰的论文题这个树形dp还是比较难的,没有想到。dp[i][j]表示以i为根的子树,i结点选j为负责站,所花的最少代价。best[i]=min{dp[i][j] | 1当dis[i][j]>limit[i],dp[i][j]=∞当dis[i][j]#include #include #include #define N 1010#define inf原创 2013-11-10 19:14:17 · 1236 阅读 · 0 评论 -
HDU 4734
比赛的时候先写了个裸的数位dp T掉了,然后加加剪枝过了原创 2013-09-14 23:45:39 · 2320 阅读 · 0 评论 -
UVALIVE 6189
这道题我做了好几天。。。太弱了。。。最后看别人的代码过的。首先二分答案,判断可行性时,先可以通过集合间的子集关系的传递性,建立关系矩阵。接着建立一个矩阵存储集合之间的交集是否一定为空,这里有一个性质,如果A是B的子集,且A与B的交集为空,则A为空集。(另外如果A与A交集为空,则A为空集)最后扫描一下不等和交集非空的条件进行判断即可。#include #include #include原创 2013-04-20 20:35:24 · 1046 阅读 · 0 评论 -
BOJ 652
数位dp+AC自动机#include #include #include #include typedef long long ll;using namespace std;ll l,r;char a[20],b[20];int aa[20];int next[100][10],pos,fail[100];bool ok[100];void insert(char原创 2013-03-19 23:50:31 · 1086 阅读 · 0 评论 -
zoj 3494
数位dp+ac自动机#include #include #include #include #define mod 1000000009#define N 2010typedef long long ll;using namespace std;char s[210];int next[N][2],nextd[N][10],pos,flag[N],fail[N];ll dp原创 2013-04-28 17:33:25 · 1254 阅读 · 0 评论 -
UVALive 6190
这道题卡了我们整场,我们想到了二分答案+判断可行性,但是卡在判断可行性上了,首先n^2的复杂度是肯定不行的,正解要优化到O(n)dp[i]表示以第i个单词作为一行结尾是否可行,初始化dp[0]=1,然后是一个迭代的过程,由dp[i]推出一个区间可行解dp[left~right]=1;接下来从left+1推出下一个区间可行解,最后在加点判断即可。注意要在整个过程中维护一个变量k表示当前最大的满足原创 2013-04-18 21:10:06 · 1867 阅读 · 0 评论 -
HDU 4267
简单树形DP#include#include#include#define N 102using namespace std;struct Edge{ int v,w,next;}edge[N*2];int n,t;int head[N],cnt;int pre[N],cost[N],num[N];bool mark[N];int dp[N][502],yes[N原创 2012-09-14 14:52:05 · 939 阅读 · 0 评论 -
HDU 4272
正解是状态压缩的搜索dfs求是否有可行解,bfs求最优解#include#include#include#includeusing namespace std;int n;int num[2000],num1[2000];int dp[1100][1100];int dfs(int pos,int sta){ int npos,nsta,i,j,cou;原创 2012-09-13 16:35:31 · 1100 阅读 · 0 评论 -
HDU 2476
卡了我三天的DP看了这篇博客才略微懂点http://blog.csdn.net/hyogahyoga/article/details/7886416#include#include#includeusing namespace std;string a,b;int dp[200][200];int f[200];void solve(int i,int j){ if原创 2012-08-31 20:58:35 · 2064 阅读 · 1 评论 -
POJ 3252 Round Numbers
数位统计的题,计算a到b之间的Round Numbers可以转化为sum(b)-sum(a-1);在计算sum(b),先统计位数小于b的Round Numbers的个数,在计算同位时要递推下去做,具体可参考代码。#include #include #include int a,b;int p[40],c[40][40];void init(){ int i,j; for(i=原创 2012-02-05 12:51:33 · 782 阅读 · 0 评论 -
POJ 3638 Moogle
dp[i][j]表示在i位置放第j个的最小error,简单DP即可#include #include #include #define inf 1e9;int h,in[210];double e[210][210];double dp[210][210];double min(double a,double b){ return a>b?b:a;}int main(){原创 2012-02-04 21:56:08 · 1306 阅读 · 0 评论 -
POJ 3519 Minimal Backgammon概率DP
很简单,具体看代码吧#include #include #include #define inf 1e9;int n,t,l,b;int map[110];double dps[110][110];double min(double a,double b){ return a>b?b:a;}void dp(){ int i,j,k; memset(dps,0,sizeo原创 2012-02-05 21:13:35 · 1194 阅读 · 0 评论 -
POJ 2228 Naptime
这个考的是环形DP,状态方程好列,需要注意的是要分两种情况讨论:一是第一段时间睡觉,另外是第一段时间不睡。剩下的DP过程一样,在最后处理结果上不同#include #include #include typedef long long ll;int n,b,a[3900];ll dp[2][3900][2];ll max(ll a,ll b){ return a>b?a:b;}原创 2012-02-05 17:04:10 · 1301 阅读 · 0 评论 -
HDU 1428 漫步校园
我队列开小了,改成循环队列就过了,真坑爹....先SPFA求出各点到终点的最短距离,然后在记忆化搜一遍,记录路径数目,注意在搜的过程中,如果移动点的dis大于等于当前位置,那么就是不可以走的,反之就是可以走的。#include #include #define inf 1e9using namespace std;int n,t[52][52],dis[52][52];__int原创 2012-02-03 17:51:25 · 1409 阅读 · 0 评论 -
HDU 1074 Doing Homework状态DP
此题总状态量很小,可以状态DP#include #include using namespace std;struct point{ char str[110]; int cost,dead;}sub[20];int n;int dp[32800],pre[32800],visit[32800],time[32800];void print(int state){ if(原创 2012-02-03 16:06:22 · 761 阅读 · 0 评论 -
HDU 2196 Computer 经典树形DP
hdu 2196 Computer 经典的树形DP 两次DFS遍历题意很简单,就是给你一棵树,每条边都有一定的权值,然后让你找到每个点所能走到的最远距离那么我们可以这样高效的来处理先以 1 作为根节点进行一次 dfs 遍历,遍历的时候把以 第 i 为根节点往子树方向可以走到的最远距离和次远距离给求出来,且这两个距离是不在同一个分支中的然后我们进行第二次的从根节点开始dfs遍历,这时转载 2012-01-06 22:49:00 · 912 阅读 · 0 评论 -
POJ 2057 The Lost House 树形DP+贪心
最近一直在做树形dp,感觉这道题出的非常不错。卡了我一天。。 一上来读完题感觉和dp的思路很像,但是自己太弱了,无从下手。于是各种百度看结题报告、看论文。推荐几个结题报告 http://hi.baidu.com/zhymaoiing/blog/item/1aa0e1ccf1bc0d1b01e9288a.htmlhttp://blog.sina.com.cn/s/blog_原创 2011-11-18 23:48:09 · 872 阅读 · 0 评论 -
POJ 3345 Bribing FIPA 树形DP
这个题就是一个树形DP,输入处理有点恶心,RE好几次。其他要注意的地方我都标注释了#include #include #include #define inf 1e9typedef long long ll;int n,m,k,cou;char map[205][105];int mon[205],head[205];int dps[205][205];struct poin原创 2012-02-05 21:08:54 · 1413 阅读 · 0 评论 -
POJ 3666 Making the Grade
这个题要往DP上想(左偏树什么的也不会)首先要知道这样一个结论:一定存在一个最优解,使得整理后的数组中不存在整理前数组中不存在的数,亦即:对于每个Bi,一定存在j,使得Bi=Aj。可以这么想,在做调整时,一定是这么做的,先选出连续的三个数abc,假设a 如果b>=a && b 如果b 如果b>c,则最小的调整可以是原创 2012-02-04 15:09:35 · 2089 阅读 · 2 评论 -
HDU 3905 Sleeping
一道很好的DP题比较容易想到的是时间复杂度为O(N3),空间复杂度为O(N2)的dp. dp[i][j]表示前i 分钟,在已经休息了j 分钟的情况下所能拿到的最大分数。于是就有:dp[i][j]=Max{ Max{ dp[i-k1][j-k1] },Max{ dp[i-k2][j] + sum[(i-k2)~(i)] } } 其中 k1=L,i-k2>=j 转移就是O(n)的原创 2012-02-04 17:06:04 · 958 阅读 · 0 评论 -
hdu 4389
数位DP状态记录非常麻烦#include#include#define N 91using namespace std;int n;int dp[11][N][N][N];//位数,各位和,模,余数int tmp[11],ten[11];void init(){ int i,mod,res,sum,now; ten[0]=1; for(i=1;i<=1原创 2012-08-22 21:15:52 · 1180 阅读 · 0 评论 -
HDU 4313
这个题有两种做法1.并查集 初始时一条边都不加,将所有边按权值从大到小排序,然后依次判断每一个边两端的顶点是否是均为machine节点,如果是则应删除这条边,否则加入这条边,然后在并查集合并时尽量让根节点为machine节点。#include#include#include#include#include#include#includeusing namesp原创 2012-07-27 14:44:31 · 1213 阅读 · 2 评论 -
FZU 2079 最大获利
线段树优化DP是dp[i]=max{dp[j]+w[j+1][i],dp[i-1]},其中1=dp[i]表示前i个项目的最大获利,w[j][i]表示项目j到i全部投资的获利。#include#include#includetypedef long long ll;int n,m;int a[20010];struct Item{ int l,r; ll v;}item原创 2012-04-29 13:22:48 · 857 阅读 · 0 评论 -
POJ 1947
给定一棵N个节点的无根树,求至少要删去多少条边,使得分离后的若干个独立的子树之中的某一子树恰好有P个节点。 TreeDP。树形动态规划。设状态f[i, j]表示以节点i为根的子树恰好有j个节点至少需要删除的边的数目。对于每个节点u。我们可以对它的儿子们(*儿子的状态必然已更新)进行一次类似背包的DP。(泛化物品的背包)r[i, j]表示由在前i个儿子中构成j个节点(*这里的j个原创 2012-04-08 12:22:03 · 879 阅读 · 0 评论 -
最长单调递增子序列 poj 2544 || HDU 3998
单调子序列包含有单调递增子序列和递减子序列,不失一般性,这里只讨论单调递增子序列。首先,从定义上明确我们的问题。给定序列a1, a2, …, an,如果存在满足下列条件的子序列ai1i2im, (其中i1即称为一个原序列的长度为m的单调递增子序列,那么,现在的问题是我们要找出一个序列的最长的单调递增子序列。直观上来说,一个序列Sn,它有2n个子序列,枚举所有的子序列,找出其中单调递原创 2012-02-06 13:42:35 · 2354 阅读 · 0 评论 -
HDU 4001 To Miss Our Children Time
一开始我一直想的是简单图论问题,构图SPFA求最长路,发现这样做有环不好处理。比如这组样例:21 1 1 01 1 1 0构图就会有环,不能直接SPFA,tarjan缩点的话应该可以做,但是代码量就太大了。可以这样去处理:bool cmp(block a,block b) { if(a.x!=b.x)return a.x if(a.y!=b原创 2012-03-24 21:38:20 · 935 阅读 · 0 评论