动态规划:DP
文章平均质量分 56
skajre
这个作者很懒,什么都没留下…
展开
-
dp 矩阵取数问题
#include#includeusing namespace std;const int MAXN=500+5;typedef long long LL;LL a[MAXN][MAXN];void dp(int i,int j){ if(i==1&&j==1) a[i][j]=a[i][j]; else if(i==1) a[i][j]=a[i][j-1]+a[i]原创 2016-05-24 21:55:39 · 241 阅读 · 0 评论 -
矩阵链乘
#include#include#include#includeusing namespace std;const int maxn=5000+10;int p[maxn],f[maxn][maxn];int main(){ int n,x,y,j; scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("原创 2016-07-09 21:22:14 · 186 阅读 · 0 评论 -
uva 10003 Cutting Sticks
i,j表示在第i与第j的位置中间且一刀的最优值,若i==j-1则i与j之间不能再切了,所以为0;#include#include#include#includeusing namespace std;const int maxn=50+5;int L,n,vis[maxn][maxn],a[maxn],f[maxn][maxn];int dp(int i,int j){原创 2016-07-10 18:38:05 · 222 阅读 · 0 评论 -
uva 1626 Brackets sequence
//// main.cpp// Richard//// Created by 邵金杰 on 16/7/1.// Copyright © 2016年 邵金杰. All rights reserved.//#include#include#include#includeusing namespace std;const int maxn=100+10;int T,原创 2016-07-10 21:53:50 · 216 阅读 · 0 评论 -
动态规划:编辑距离问题
#include#include#include#includeusing namespace std;const int maxn=1000+10;char a[maxn],b[maxn];int f[maxn][maxn];int main(){ scanf("%s%s",a+1,b+1); int len1=(int)strlen(a+1); int原创 2016-07-11 09:21:46 · 326 阅读 · 0 评论 -
HDU 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活
多重背包裸题。#include#include#include#includeusing namespace std;const int maxn=100+10;int n,m;int p[maxn],h[maxn],c[maxn];int f[maxn];int main(){ int t; scanf("%d",&t); while(t--)原创 2016-07-11 18:40:40 · 249 阅读 · 0 评论 -
HDU 1203 I NEED A OFFER!
#include#include#include#includeusing namespace std;const int maxn=10000+10;int a[maxn];float f[maxn],b[maxn];int main(){ int n,m; while(scanf("%d%d",&n,&m)&&(n||m)) { for原创 2016-07-11 20:55:07 · 189 阅读 · 0 评论 -
51nod 动态规划基础
矩阵取数问题#include#includeusing namespace std;const int MAXN=500+5;typedef long long LL;LL a[MAXN][MAXN];void dp(int i,int j){ if(i==1&&j==1) a[i][j]=a[i][j]; else if(i==1) a[i][j]=a[i][j原创 2016-07-11 21:01:39 · 266 阅读 · 0 评论 -
51nod 动态规划入门
最大子矩阵和#include#include#include#includeusing namespace std;const int maxn=500+10;int f[maxn],c[maxn][maxn],d[maxn];int main(){ int m,n,ans=0,sum=0,b=0; scanf("%d%d",&m,&n); for(int原创 2016-07-11 21:05:17 · 294 阅读 · 0 评论 -
树的最大独立集
#include#include#include#include#includeusing namespace std;const int maxn=100+5;int n,l[maxn],p[maxn],f[maxn],sumc[maxn],sums[maxn],maxl;vector G[maxn];void readtree(){ int u,v; sca原创 2016-07-12 10:19:39 · 317 阅读 · 0 评论 -
POJ 1655 Balancing Act
只要一次无根树转有根树就可以计算了,一开始每个点都转,发现那就不是动态规划,是枚举了。。。。#include#include#include#include#includeusing namespace std;const int maxn=20000+100;vector G[maxn];int son[maxn],f[maxn],ans,flag,n;void dfs(int原创 2016-07-13 09:52:34 · 182 阅读 · 0 评论 -
POJ 3107 Godfather
head保存的是以u为起点出现的最后一条边,next表示之前以u为起点的边,一只搜索回去,知道为-1。#include#include#include#includeusing namespace std;const int maxn=50000+100;int n,len,ans,cnt=0,p[maxn],son[maxn],head[maxn],vis[maxn];stru原创 2016-07-13 15:40:03 · 173 阅读 · 0 评论 -
POJ 2631 Roads in the North
#include#include#include#includeusing namespace std;const int maxn=10000+100;int len,ans,cnt=0,p[maxn],son[maxn],head[maxn],vis[maxn],weigh[maxn][maxn];struct node{ int u,v,next;}node[2*ma原创 2016-07-13 16:25:46 · 167 阅读 · 0 评论 -
uva 12186 Another Crisis
c=(k*t-1)/100+1如果不减1当10 10时是2,如果不加一不减一的话那么3 50是1而不是2.#include#include#include#include#includeusing namespace std;const int maxn=100000+10;vector son[maxn];int n,t,c,u;int dp(int u){ if原创 2016-07-13 20:23:50 · 188 阅读 · 0 评论 -
硬币问题
#include#include#include#includeusing namespace std;int maxv[100],minv[100];const int INF=10000;int n,v[100];void print(int s,int d[]){ for(int i=0;i<n;i++) { if(s>=v[i]&&(d[s原创 2016-07-02 09:26:07 · 244 阅读 · 0 评论 -
uva 1025 A Spy in the Metro
#include#include#include#includeusing namespace std;const int INF=10000;int dp[205][205];int has_train[205][205][2];int main(){ int n,t; int kase=0; while(cin>>n&&n&&cin>>t) {原创 2016-07-02 14:42:51 · 166 阅读 · 0 评论 -
最优配对问题
for(int S=0;S<(1<<n);S++) { int i,j; d[S]=INF; for(i=0;i<n;i++) if(S&(1<<i)) break; for(j=i+1;j<n;j++) d[S]=min(d[S],dist(i,j)+d[S^(1<<i)^(1原创 2016-07-13 21:15:18 · 340 阅读 · 0 评论 -
uva 10817 Headmaster's Headache
#include#include#include#include#includeusing namespace std;#define INF 10000000const int maxs=8;const int maxn=100+20+5;int c[maxn],st[maxn],f[maxn][(1<<maxs)][(1<<maxs)],s,m,n;int dp(int i原创 2016-07-14 09:54:08 · 158 阅读 · 0 评论 -
uva 437 The Tower of Babylon
第一次写dp的题目,感觉代码写的很拙劣,虽然一次就AC了。思路是DAG上的有向无环最长路,用h存放高度,然后往下所搜索就可以了。#include#include#include#includeusing namespace std;struct node{ int x,y,z;}node[100];int n;int G[200][200];int h[200];i原创 2016-07-03 08:25:04 · 137 阅读 · 0 评论 -
uva 1252 Twenty Questions
#include#include#include#includeusing namespace std;const int maxn=11;int cnt[(1<<maxn)][(1<<maxn)],f[(1<<maxn)][(1<<maxn)],vis[(1<<maxn)][(1<<maxn)];char objects[158][maxn];int n,m,kase=0;in原创 2016-07-14 13:49:24 · 196 阅读 · 0 评论 -
uva 1347 Tour
思路是定义状态d[i][j],代表现在的位置i,j里重点的距离,且i>j。#include#include#include#include#includeusing namespace std;const int maxn=1000+10;double x[maxn],y[maxn];double dist[maxn][maxn];double d[maxn][maxn];原创 2016-07-03 18:24:04 · 167 阅读 · 0 评论 -
uva 116 Unidirectional TSP
d[i][j]存放往右,右上,右下的最优决策,next[i][j]存放最优且字典序最小的行数,然后从最后一列逆退回来。d[i][j]代表目前的位置是i,j,且存放的是从该列到最后一列的最小整数和。#include#include#include#includeusing namespace std;const int INF=10000;int main(){ int原创 2016-07-03 19:47:08 · 204 阅读 · 0 评论 -
HDU 2546 饭卡
先把单价数组排序,取出最贵的赋值给MAX,然后再把m-5,用于购买这个最贵的,然后dp[j]表示在j元的情况下能买到的最多价值的东西,dp[m]代表代表m元能买到的最多。#include#include#include#includeusing namespace std;int dp[1010];int price[1010];int main(){ int n;原创 2016-07-06 11:36:11 · 160 阅读 · 0 评论 -
HDU 1171 Big Event in HDU
#include#include#include#includeusing namespace std;int val[5005];int dp[255555];int main(){ int n; while(cin>>n&&(n>0)) { memset(dp,0,sizeof(dp)); memset(val,0,siz原创 2016-07-06 12:38:05 · 161 阅读 · 0 评论 -
HDU 2602 Bone Collector
#include#include#include#include#includeusing namespace std;int dp[1010];int val[1010];int vol[1010];int main(){ int n; scanf("%d",&n); while(n--) { int k,v;原创 2016-07-06 15:33:47 · 179 阅读 · 0 评论 -
HDU 2955 Robberies
这道题要求的是逃跑几率高于一开始给出的逃跑纪律,所以要用钱数做背包来求逃跑几率的最大值。#include#include#include#includeusing namespace std;int main(){ int t; scanf("%d",&t); while(t--) { float dp[10000];原创 2016-07-06 16:09:46 · 160 阅读 · 0 评论 -
HDU 3466 Proud Merchants
这道题有一个q[i]的限制,像HDU饭卡那道题一样,那题q[i]恒为5,此题是变的,所以需要排序,因为如果不排序,散乱的话有可能前一个导致的状态的改变后一个利用不到,所以一开始(x,m)这个区间的范围要大,也就是x要小,那么后面的状态就可以背前面的状态影响,那么x就是这个区间的下限,这个下线就是q[i]-p[i].#include#include#include#includeusin原创 2016-07-06 19:54:04 · 166 阅读 · 0 评论 -
HDU 1864 最大报销额
a,b,c分别代表所报销类目的钱数,到最后整合为a+b+c ,那样就不会出现这张发票报销了一半,另一半无法报销的情况无法判断,有时候应该把事物整合成一个整体再进行处理。#include#include#include#includeusing namespace std;int dp[3000005];int money[35];int main(){ float x,y;原创 2016-07-06 21:13:27 · 181 阅读 · 0 评论 -
HDU 1950 Bridging signals 最长公共子序列(LIS)nlogn算法实现
d这个数组是用来存放最长公共子序列的,且是字典序最小的。思路是当a数组中的数中寻找最长公共子序列时,假设dp[i]这个数组放的是以i结尾的最长公共子序列长度,那么假设dp[x]=dp[y]且x代码如下:#include#include#include#includeusing namespace std;const int maxn=40010;int d[maxn];i原创 2016-07-07 14:02:36 · 214 阅读 · 0 评论 -
LCS输出
又踩了一个坑。#include#include#include#includeusing namespace std;const int maxn=2000;int dp[maxn][maxn];char a[maxn];char b[maxn];char d[maxn];int f[maxn][maxn];void dfs(int m,int n){ cout原创 2016-07-07 18:24:06 · 218 阅读 · 0 评论 -
uva 11400 Lighting System Design
d[i]代表从1-i的最小花费,s[i]代表1-i的所有灯泡数,d[j]+(s[r[i]]-s[r[j]])*c[r[i]]+k[r[i]]代表替换从j+1~i的所有灯泡,用i灯泡替换,然后加上1~j的花费。#include#include#include#includeusing namespace std;const int maxn=1000+10;int v[m原创 2016-07-08 09:21:44 · 163 阅读 · 0 评论 -
百练 2755 神奇的口袋
递归#include#include#include#includeusing namespace std;const int maxn=30;int n,d[maxn];int dp(int w,int n){ if(w==0) return 1; if(n==0) return 0; return dp(w,n-1)+dp(w-d[n],n-1);}原创 2016-07-19 07:58:09 · 352 阅读 · 0 评论 -
百练 1088 滑雪
#include#include#include#includeconst int maxn=100+10;using namespace std;struct node{ int w,x,y; bool operator < (const node &b) const{ return this->w<b.w; }}node[maxn*maxn原创 2016-07-19 08:36:25 · 421 阅读 · 0 评论 -
uva 11584 Partitioning by Palindromes
这判断回文串的方法真是绝了。#include#include#include#includeusing namespace std;const int maxn=1000+10;char s[maxn];int vis[maxn][maxn],p[maxn][maxn],d[maxn];int kase,len;int is_palindromes(int i,int j)原创 2016-07-08 11:54:55 · 206 阅读 · 0 评论 -
POJ 1390 Blocks
定义f[i][j][ex_len]的状态为,清除i,j之间的木块的最大值,且与j有相邻的且长度为ex_len的木块,那么设j与ex_len连起来的木块为Q。则有两种选择,一种选择是点掉Q,然后继续点掉i~j-1范围内的木块取最大值,他的值result=dp(i,j-1,0)+(len[j]+ex_len)*(len[j]+ex_len);另一种选择是从i~j-1中寻找一个与j,ex_len原创 2016-07-19 11:07:06 · 347 阅读 · 0 评论 -
HDU 2602 Bone Collector(01背包)
状态转移f[j]=max(f[j],f[j-v[i]]+w[i])。//// main.cpp// Richard//// Created by 邵金杰 on 16/9/9.// Copyright © 2016年 邵金杰. All rights reserved.//#include#include#include#includeusing namespa原创 2016-09-09 09:09:17 · 155 阅读 · 0 评论 -
HDU 1087 Super Jumping! Jumping! Jumping!(dp最长上升子序列的和)
f[i]=max(f[i],f[j]+d[i])。//// main.cpp// Richard//// Created by 邵金杰 on 16/9/9.// Copyright © 2016年 邵金杰. All rights reserved.//#include#include#include#includeusing namespace std;c原创 2016-09-09 09:37:36 · 170 阅读 · 0 评论 -
HDU 2391 Filthy Rich(dp)
//// main.cpp// Richard//// Created by 邵金杰 on 16/9/9.// Copyright © 2016年 邵金杰. All rights reserved.//#include#include#include#includeusing namespace std;const int maxn=1000+10;int原创 2016-09-09 10:10:45 · 169 阅读 · 0 评论 -
HDU 2571 命运(dp)
//// main.cpp// Richard//// Created by 邵金杰 on 16/9/9.// Copyright © 2016年 邵金杰. All rights reserved.//#include#include#include#includeusing namespace std;const int maxn=1000+10;cons原创 2016-09-09 10:49:21 · 237 阅读 · 0 评论 -
HDU 1069 Monkey and Banana(dp最长上升子序列)
方程f[i]=max(f[i],f[j]+h[i])。//// main.cpp// Richard//// Created by 邵金杰 on 16/9/9.// Copyright © 2016年 邵金杰. All rights reserved.//#include#include#include#include#includeusing names原创 2016-09-09 20:26:41 · 182 阅读 · 0 评论