DP
菜鸟起航
这个作者很懒,什么都没留下…
展开
-
hdu 1506 Largest Rectangle in a Histogram
#includeusing namespace std;#define N 100002int L[N],R[N],H[N];int main(){ int i,n; while(scanf("%d",&n),n) { for(i=1;i<=n;i++) { scanf("%d",&H[i]); L[i]=R[i]=i; } H[0]=-2;H[n+1]原创 2013-04-10 23:03:20 · 406 阅读 · 0 评论 -
hdu 4552
hdu3336一样的题目kmp+dp可以做.队友的思路,开一个数组记录与前一个字符相等的下表,每次只需比较与上个字符相等下表+1的字符是否相等#include#includeint a[100001];int main(){ int i,j,k,p,len; char s[100001]; while(scanf("%s",s)!=-1) {原创 2013-05-25 08:15:10 · 1053 阅读 · 0 评论 -
hdu 4612 (双联通+树形DP)
加一条边后最少还有多少个桥,先Tarjan双联通缩点,然后建树,求出树的直径,在直径起点终点加一条边去的桥最多,#pragma comment(linker, "/STACK:1024000000,1024000000")#include#include#include#define N 200001using namespace std;int原创 2013-07-31 18:51:38 · 851 阅读 · 0 评论 -
hdu 1520 (树形DP)
dp[i][0]表示i不参加dp[i][1]表示i参加简单的树形dp#include#include#define N 6100#define inf 0x3fffffffint dp[N][2],vis[N],head[N],num,n,lo[N],mm;struct edge{ int st,ed,next;}E[N*2];voi原创 2013-07-31 18:58:59 · 643 阅读 · 0 评论 -
hdu 4607 (树形DP)
当时比赛的时候我们找出来只要求出树的最长的边的节点数ans,如果要访问点的个数n小于ans距离直接就是n-1如果大于的话就是(n-ans)*2+ans-1,当时求树的直径难倒我们了,都不会树形dp选一个点当根每次求出一点到子节点的最大距离和次大距离,两个的和最大的就是树的直径还在网上看到一种方法,任意一点广搜达到最远点max,再从max广搜,到达最远点就是树的直径自己想了想这种方法原创 2013-07-31 18:42:58 · 673 阅读 · 0 评论 -
hdu 2196 (树形DP)
求出每一点到所有点的最大距离,刚开始就有点想法求最长边的问题,但想了一会不知道怎么去把子节点转化成根节点。任选一点为根节点,先求出每个节点到子节点的最大距离和次大距离,然后更新每个子节点的最大,次大距离,就是把每个子节点当一次根节点,如果它在父节点的最大距离边上,就用次大距离+到父节点的距离与自己的最大次大距离比较,,,,#include#incl原创 2013-07-31 19:10:42 · 738 阅读 · 0 评论 -
poj 4045 (树形DP)
先选一点为根节点找出所有父节点i到下面所有点距离和dp[i],该父节点下面有多少个点Node[i]。然后求出所有节点的所有非子节点到该点的距离dp1[v]+=(dp1[u]+(dp[u]-dp[v]-Node[v]-1)+n-Node[v]-1)dp[u]-dp[v]-Node[v]-1:u的子节点中除了v这一部分子节点到u的距离n-Node[v]-1:非v的字节点的个数原创 2013-07-31 19:28:50 · 812 阅读 · 0 评论 -
hdu 2242 (双联通+树形DP)
Tarjan双联通缩点后,建树,任选一点为根节点求出所有点的字节点的个数+1:m然后求出n-m与m的差值,求出最小的#include#include#include#define inf 0x3fffffff#define N 10001using namespace std;int belong[N],dfs[N],low[N],idx原创 2013-08-01 11:55:03 · 840 阅读 · 0 评论 -
hdu 3998 (dp+最大流)
题意:求最长上升子序列的长度和数量。分析:用dp求出最长上升子序列m,dp数组存的就是该元素为子序列结尾的长度,源点与长度为1的点建边,长度为m的与汇点连边,然后枚举任意两个元素,ai,aj(ai>aj&&i>j&&dp[i]==dp[j]+1),j跟i连边,因为每个点只能选一次,所以边的容量都为1,求出最大流。#include#includeconst int原创 2013-08-19 18:28:59 · 806 阅读 · 0 评论 -
hdu 4679 (树形DP)
题意:给一棵树,边的权值都是1,摧毁每条边是有代价的,选择摧毁一条边,把一棵树分成两部分,求出两部分中距离最大的两点的距离,求出距离*代价最小的边,多条的话输出序号最小的。刚开始理解错题意了,wrong了几次,一直在纠结摧毁一条边后上边的树的最远距离怎么求,儿子树的最远距离就是所有子树的最长边+次长边就可以了。当我们求到一个节点u时,肯定有一个祖先节点,该祖先节点在摧毁与u链接的边后剩余的子树原创 2013-08-15 17:39:33 · 1230 阅读 · 2 评论 -
URAL 1018 (金典树形DP)
连接:1018. Binary Apple TreeTime limit: 1.0 secondMemory limit: 64 MBLet's imagine how apple tree looks in binary computer world. You're right, it looks just like a binary tree, i.e. any原创 2013-09-09 16:18:46 · 1037 阅读 · 0 评论 -
URAL 1056(树形DP)
1056. Computer NetTime limit: 2.0 secondMemory limit: 64 MBBackgroundComputer net is created by consecutive computer plug-up to one that has already been connected to the net. Each new原创 2013-09-09 17:35:50 · 916 阅读 · 0 评论 -
hdu 4714 (树形dp)
题意:给一棵树,删除一条边和增加一条边代价都是1,问把所有节点连成环,最少的代价。思路:可以将树删成ans+1条链,答案就是ans+ans+1。如果一个节点的分支数大于1的话,就把该点与父节点的边删点,该节点形成的链数就是son-1。树的根节点注意,应为根节点可以有两个分支。#pragma comment(linker, "/STACK:1024原创 2013-10-09 17:34:34 · 1041 阅读 · 0 评论 -
hdu 2391
直接遍历#include#includeint map[1010][1010],dp[1010][1010];int main(){ int i,j,n,m,t,op=1; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); for(i=0;i<n;i++) for(j=0;j<m;j原创 2013-05-23 13:38:55 · 982 阅读 · 0 评论 -
hdu 3485
记录后两位,共有4种情况00->001->110->211->3;dp[i][0]=dp[i-1][0]+dp[i-1][2];dp[i][1]=dp[i-1][0];dp[i][2]=dp[i-1][1]+dp[i-1][3];dp[i][3]=dp[i-1][1]+dp[i-1][3];#include#include#inclu原创 2013-05-22 15:49:54 · 866 阅读 · 1 评论 -
hdu 2512
dp[i][j]=(dp[i-1][j-1]+j*dp[i-1][j]) #includeint dp[2001][2001];int main(){ int i,j,k; for(i=1;i<=2000;i++) { dp[i][1]=1; dp[i][i]=1; } for(i=2;i<=2000;i++) { f原创 2013-05-20 21:13:56 · 793 阅读 · 0 评论 -
hdu 2861 Stools
a[n][m][k]:n个座位,m个人,分成k段,,最后座位坐人的情况b[n][m][k]:n个座位,m个人,分成k段,,最后座位不坐人的情况状态转移方程a[n][m][k]=a[n-1][m][k]+b[n-1][m][k-1];b[n][m][k]=a[n-1][m-1][k-1]+b[n-1][m-1][k];#include__int64 a[202]原创 2013-04-11 12:46:46 · 514 阅读 · 0 评论 -
hdu 3336 Count the string
求字符串的所有前缀在字符串中出现的次数之和next[i]=j;dp[j]:以s[j]结尾的子串总共含前缀的数量dp[i]=1+dp[next[i]]: 以i结尾的子串中含前缀的数量加上前j个字符这一前缀#include#include#define N 200002int dp[N],next[N],n;char s[N];void get(){原创 2013-04-11 13:35:52 · 524 阅读 · 0 评论 -
hdu 1505 City Game
转化成与1506相似的问题;high[i][j]:以i为最底面j的高度;#includechar map[1001][1001];int high[1001][1001],L[1001],R[1001];int main(){ int i,j,n,m,t,k,max,sum; char ch[10]; scanf("%d",&t); while(t-原创 2013-04-12 11:46:32 · 525 阅读 · 0 评论 -
hdu 2830 Matrix Swapping II
行可以交换dp[i][j]:弟ij个上面有几个1然后排序,,最大的dp[i][j]*1,dp[i][j-1]*2.......#include#include#includechar map[1002][1002];int dp[1010][1010];int cmp(const void *a,const void *b){ return *(int *原创 2013-04-12 23:52:12 · 427 阅读 · 0 评论 -
hdu 2660 Accepted Necklace
简单dp #include#includeint dp[21][1010];int main(){ int i,j,n,k,vp,v[21],w[21],t,p; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&k); for(i=0;i<n;i++) scanf("%d%d"原创 2013-04-22 19:51:40 · 570 阅读 · 0 评论 -
hdu 1292 "下沙野骆驼"ACM夏令营
#include__int64 dp[26][26];int main(){ int i,j,n,t; dp[1][1]=1; for(i=2;i<25;i++) { for(j=1;j<i;j++) dp[i][j]=dp[i-1][j-1]+dp[i-1][j]*j; dp[i][i]=1; } scanf("%d",&t); while(t--) {原创 2013-04-27 23:07:13 · 1083 阅读 · 0 评论 -
hdu 2151 Worm
dp[i][j]:第i分钟走到j棵树上的走方案数dp[i][j]+=dp[i-1][j+1]+dp[i-1][j-1] #include#includeint dp[101][101];int main(){ int i,j,n,m,p,t; while(scanf("%d%d%d%d",&n,&p,&m,&t)!=EOF) { memset(dp,0,size原创 2013-04-21 21:28:14 · 435 阅读 · 0 评论 -
hdu 2182 Frog
简单dpdp[i][j];跳i次到j可以吃到的虫 #include#includeint dp[110][110],w[110];int main(){ int i,j,k,a,b,n,p,max,t; scanf("%d",&t); while(t--) { scanf("%d%d%d%d",&n,&a,原创 2013-04-22 11:19:05 · 557 阅读 · 0 评论 -
hdu 1208 Pascal's Travels
简单dpdp[i][j]:到map[i][j]的步数 #include#include__int64 dp[40][40];int map[40][40];int main(){ int i,j,n; char s[40]; while(scanf("%d",&n),n>0) { for(i=0;i<n;i++) {原创 2013-04-20 20:37:36 · 484 阅读 · 0 评论 -
hdu 1978
dp#includeint map[110][110],dp[110][110];int main(){ int t,n,m,i,j,sum,k,p; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); for(i=0;i<n;i++) for(j=0;j<m;j++) {原创 2013-05-06 21:18:43 · 599 阅读 · 0 评论 -
hdu 2670
如果确定了选哪几个,顺序肯定是Li大的先选,所以可以按Li排序,再像0-1背包一样依次添加 #include#include#includeint dp[1001];struct op{ int w,v;}p[1001];int cmp(const void *a,const void *b){ struct op *c原创 2013-05-20 22:33:32 · 837 阅读 · 0 评论