DP
菜鸟起航
这个作者很懒,什么都没留下…
展开
-
hdu 1506 Largest Rectangle in a Histogram
#include using namespace std; #define N 100002 int 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 · 403 阅读 · 0 评论 -
hdu 4552
hdu3336一样的题目 kmp+dp可以做. 队友的思路,开一个数组记录与前一个字符相等的下表, 每次只需比较与上个字符相等下表+1的字符是否相等 #include #include int a[100001]; int main() { int i,j,k,p,len; char s[100001]; while(scanf("%s",s)!=-1) {原创 2013-05-25 08:15:10 · 1042 阅读 · 0 评论 -
hdu 4612 (双联通+树形DP)
加一条边后最少还有多少个桥,先Tarjan双联通缩点, 然后建树,求出树的直径,在直径起点终点加一条边去的桥最多, #pragma comment(linker, "/STACK:1024000000,1024000000") #include #include #include #define N 200001 using namespace std; int原创 2013-07-31 18:51:38 · 841 阅读 · 0 评论 -
hdu 1520 (树形DP)
dp[i][0]表示i不参加 dp[i][1]表示i参加 简单的树形dp #include #include #define N 6100 #define inf 0x3fffffff int 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 · 640 阅读 · 0 评论 -
hdu 4607 (树形DP)
当时比赛的时候我们找出来只要求出树的最长的边的节点数ans,如果要访问点的个数n小于ans距离直接就是n-1 如果大于的话就是(n-ans)*2+ans-1,当时求树的直径难倒我们了,都不会树形dp 选一个点当根每次求出一点到子节点的最大距离和次大距离,两个的和最大的就是树的直径 还在网上看到一种方法,任意一点广搜达到最远点max,再从max广搜,到达最远点就是树的直径 自己想了想这种方法原创 2013-07-31 18:42:58 · 662 阅读 · 0 评论 -
hdu 2196 (树形DP)
求出每一点到所有点的最大距离,刚开始就有点想法求最长边的问题,但想了一会不知道怎么去把子节点转化成根节点。 任选一点为根节点,先求出每个节点到子节点的最大距离和次大距离,然后更新每个子节点的最大,次大距离,就是把每个子节点当一次根节点,如果它在父节点的最大距离边上,就用次大距离+到父节点的距离与自己的最大次大距离比较,,,, #include #incl原创 2013-07-31 19:10:42 · 733 阅读 · 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 · 804 阅读 · 0 评论 -
hdu 2242 (双联通+树形DP)
Tarjan双联通缩点后,建树,任选一点为根节点求出所有点的字节点的个数+1:m 然后求出n-m与m的差值,求出最小的 #include #include #include #define inf 0x3fffffff #define N 10001 using namespace std; int belong[N],dfs[N],low[N],idx原创 2013-08-01 11:55:03 · 829 阅读 · 0 评论 -
hdu 3998 (dp+最大流)
题意:求最长上升子序列的长度和数量。 分析:用dp求出最长上升子序列m,dp数组存的就是该元素为子序列结尾的长度,源点与长度为1的点建边,长度为m的与汇点连边,然后枚举任意两个元素,ai,aj(ai>aj&&i>j&&dp[i]==dp[j]+1),j跟i连边,因为每个点只能选一次,所以边的容量都为1,求出最大流。 #include #include const int原创 2013-08-19 18:28:59 · 800 阅读 · 0 评论 -
hdu 4679 (树形DP)
题意:给一棵树,边的权值都是1,摧毁每条边是有代价的,选择摧毁一条边,把一棵树分成两部分,求出两部分中距离最大的两点的距离,求出距离*代价最小的边,多条的话输出序号最小的。 刚开始理解错题意了,wrong了几次,一直在纠结摧毁一条边后上边的树的最远距离怎么求,儿子树的最远距离就是所有子树的最长边+次长边就可以了。当我们求到一个节点u时,肯定有一个祖先节点,该祖先节点在摧毁与u链接的边后剩余的子树原创 2013-08-15 17:39:33 · 1196 阅读 · 2 评论 -
URAL 1018 (金典树形DP)
连接:1018. Binary Apple Tree Time limit: 1.0 second Memory limit: 64 MB Let'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 · 1025 阅读 · 0 评论 -
URAL 1056(树形DP)
1056. Computer Net Time limit: 2.0 second Memory limit: 64 MB Background Computer 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 · 912 阅读 · 0 评论 -
hdu 4714 (树形dp)
题意:给一棵树,删除一条边和增加一条边代价都是1,问把所有节点连成环,最少的代价。 思路:可以将树删成ans+1条链,答案就是ans+ans+1。如果一个节点的分支数大于1的话,就把该点与父节点的边删点,该节点形成的链数就是son-1。树的根节点注意,应为根节点可以有两个分支。 #pragma comment(linker, "/STACK:1024原创 2013-10-09 17:34:34 · 1035 阅读 · 0 评论 -
hdu 2391
直接遍历 #include #include int 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 · 967 阅读 · 0 评论 -
hdu 3485
记录后两位,共有4种情况 00->0 01->1 10->2 11->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 · 826 阅读 · 1 评论 -
hdu 2512
dp[i][j]=(dp[i-1][j-1]+j*dp[i-1][j]) #include int 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 · 782 阅读 · 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 · 505 阅读 · 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 200002 int dp[N],next[N],n; char s[N]; void get() {原创 2013-04-11 13:35:52 · 519 阅读 · 0 评论 -
hdu 1505 City Game
转化成与1506相似的问题; high[i][j]:以i为最底面j的高度; #include char 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 · 521 阅读 · 0 评论 -
hdu 2830 Matrix Swapping II
行可以交换 dp[i][j]:弟ij个上面有几个1 然后排序,,最大的dp[i][j]*1,dp[i][j-1]*2....... #include #include #include char map[1002][1002]; int dp[1010][1010]; int cmp(const void *a,const void *b) { return *(int *原创 2013-04-12 23:52:12 · 422 阅读 · 0 评论 -
hdu 2660 Accepted Necklace
简单dp #include #include int 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 · 567 阅读 · 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 · 1074 阅读 · 0 评论 -
hdu 2151 Worm
dp[i][j]:第i分钟走到j棵树上的走方案数 dp[i][j]+=dp[i-1][j+1]+dp[i-1][j-1] #include #include int 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 · 431 阅读 · 0 评论 -
hdu 2182 Frog
简单dp dp[i][j];跳i次到j可以吃到的虫 #include #include int 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 · 552 阅读 · 0 评论 -
hdu 1208 Pascal's Travels
简单dp dp[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 · 478 阅读 · 0 评论 -
hdu 1978
dp #include int 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 · 594 阅读 · 0 评论 -
hdu 2670
如果确定了选哪几个,顺序肯定是Li大的先选,所以可以按Li排序,再像0-1背包一样依次添加 #include #include #include int 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 · 834 阅读 · 0 评论