动态规划
文章平均质量分 51
qingsongxiong123
这个作者很懒,什么都没留下…
展开
-
Problem B: qwb与矩阵
直接贴代码,NOIP真题的改遍,但一直TLE,我用的是DP,没想到还可以记忆化搜索。#include#include#include#include#include#include#include#include#includeusing namespace std;const int inf=(1<<30)-1;const int maxn=10010;const i原创 2017-06-01 23:24:32 · 361 阅读 · 0 评论 -
USACO 3.3.2
【描述】在商店中,每一种商品都有一个价格(用整数表示)。例如,一朵花的价格是 2 zorkmids (z),而一个花瓶的价格是 5z 。为了吸引更多的顾客,商店举行了促销活动。促销活动把一个或多个商品组合起来降价销售,例如:三朵花的价格是 5z 而不是 6z, 两个花瓶和一朵花的价格是 10z 而不是 12z。 编写一个程序,计算顾客购买一定商品的花费,尽量利用优惠使花费最原创 2017-07-06 02:05:11 · 367 阅读 · 0 评论 -
zoj 1254
Mr. Jones is an exemplary husband. Every Saturday morning Mrs. Jones gives him a list of goods to be bought from the supermarket and he buys exactly what he has been asked for, always choosing the b原创 2017-07-06 02:40:30 · 467 阅读 · 0 评论 -
POJ 2192
DescriptionGiven three strings, you are to determine whether the third string can be formed by combining the characters in the first two strings. The first two strings can be mixed arbitrarily, bu原创 2017-07-06 03:17:53 · 352 阅读 · 0 评论 -
POJ 2392
多重背包。#include#include#include#include#include#include#include#includeusing namespace std;#define MAXV 410#define MAXM 40010typedef struct{ int h,a,c;}Blocks;Blocks v[MAXV];int cmp原创 2017-07-06 08:24:50 · 305 阅读 · 0 评论 -
动态规划经典问题
股票问题给出一只股票在n天内的价格,求1元本金的最大收益。#include#include#include#include#include#includeusing namespace std;int main(){ int i,n; double v,f=1,g=0; scanf("%d",&n); for(int i=1;i<=n;i++) { scan原创 2017-07-06 09:34:16 · 244 阅读 · 0 评论 -
hdu2431 Counting problem
动态规划,最小表示法。等价于整数n的划分方案数,每个数都要大于等于2。#include#include#includeusing namespace std;const int maxn=505;const int m=1e6+7;int a[maxn];void init(){ memset(a,0,sizeof(a)); a[0]=1; for(int i=原创 2017-06-19 00:41:38 · 290 阅读 · 0 评论 -
noip2001 数的划分
给定一个整数n,将其划分成k份。#include#include#include#define MM 201using namespace std;int f[MM][8],n,kind;int main(){ cin>>n>>kind; f[1][1]=1; for(int i=2;i<=n;i++) for(j=1;j<=kind;j++) if(i>=j) f原创 2017-07-06 09:47:24 · 412 阅读 · 0 评论 -
IOI96 最长前缀
P1809【USACO2.3.1】Longest Prefix最长前缀 IOI’96时间限制 : 15000 MS 空间限制 : 65536 KB问题描述 在生物学中,一些生物的结构是用包含其要素的大写字母序列来表示的。生物学家对于把长的序列分解成较短的序列(即元素)很感兴趣。 如果一个集合 P 中的元素可以通过串联(元素可以重复使用,相当于 Pascal 中的 “+”原创 2017-07-06 12:27:34 · 467 阅读 · 1 评论 -
轰炸问题、连续子序列的积、n个最大连续子序列和
#include#include#includeusing namespace std;int m,n,h,w;int a[1001][1001],su[1001][1001];int main(){ int i,j,Ma=-INT_MAX; cin>>m>>n>>w>>h; for(i=1;i<=m;i++) for(j=1;j<=n;j++) { cin>>a[i原创 2017-07-06 13:09:36 · 272 阅读 · 0 评论 -
noip2003 数字游戏
点击打开链接#include#include#include#define INF 1<<20using namespace std;int Max,Min,n,m,line[200],sum[200];int f[200][20];int g[200][20];void dp(int a[]){ int i,j,k; for(i=1;i<=n;i++) sum[i]原创 2017-07-06 21:39:02 · 1041 阅读 · 0 评论 -
zoj 2042
opt[i,j]表示前i个数%k是否可以得到余数为j的结果。#include#include#include#include#define clr(a) memset(a,0,sizeof(a))#define N 10001#define M 101using namespace std;int a[N];int b[N][M];int p,q;int n,m;int原创 2017-07-07 03:15:51 · 220 阅读 · 0 评论 -
URAL 1167
f[i][j]为第i个马厩分配j匹马的最小冲突值。#include#include#include#define INF 1<<20using namespace std;int f[505][505],a[501],s[501];int main(){ int n,k; int minn; scanf("%d%d",&n,&k); for(int i=1;i<=n;i原创 2017-07-07 04:16:48 · 267 阅读 · 0 评论 -
noip 2000 乘积最大
点击打开链接#include#include#include#include#includeusing namespace std;char str[41];long g(int start,int end){ long i; long s=0,t=1; for(i=end;i>=start;i--) { s+=(str[i]-'0')*t; t*=10;原创 2017-07-07 04:25:23 · 280 阅读 · 0 评论 -
资源分配
给定M个资源,分配给N个部门,每个部门获得不同数目的资源有不同的盈利值,求怎样分配使得盈利值最大。原创 2017-07-06 01:32:02 · 723 阅读 · 0 评论 -
UVA 10003 切割能量棒
#include#include#include#include#include#include#define INF 1<<20using namespace std;int main(){ int length,n,i,j,x,y,temp,l,k,tt,sum; int t[51][51],p[51]; while(scanf("%d",&length)&&leng原创 2017-07-05 20:44:07 · 297 阅读 · 0 评论 -
流水作业调度问题
n个作业交给两台机器处理,每个机器处理每个作业都有一个时间,求处理完成所有任务的最短时间。#include#include#include#include#include#include#define INF 1<<20using namespace std;int p[2000]={0};int main(){ int n; int i,j,k,sa=0,sb=0,原创 2017-07-05 20:25:46 · 607 阅读 · 0 评论 -
hdu2476 String painter
动态规划。#include#include#include#include#define maxn 101#define maxc 26using namespace std;char src[maxn];char dst[maxn];int f[maxn][maxn][maxc+1];int main(){ while(scanf("%s%s",src,dst原创 2017-06-19 04:01:25 · 187 阅读 · 0 评论 -
通配符
*能匹配0个或多个字母,?能匹配任意一个字符。#include#include#include#include#includeusing namespace std;char w[100];char s[100];bool m[51][51];int n;bool match(char *w,char *s){ int i,j; for(i=0;i<=strlen原创 2017-06-29 18:08:50 · 281 阅读 · 0 评论 -
蚁人
两只蚁队要占领一个山丘,给出两个蚁队占领山丘中每个洞穴所用的时间,若两洞穴相邻,占领其中一个后另一个的时间变成原来的一半,求最少所用时间。树状动态规划。#include#include#include#include#include#include#includeusing namespace std;vectorg[101];int t[101][2];int f转载 2017-06-21 02:14:09 · 301 阅读 · 0 评论 -
读书
给出条件:1、每天要读多少本书;2、每天读每本书的价钱;3、连续读多本书的套餐价;4、连续读多天的套餐价。求最少花费。#include#include#include#include#include#include#includeusing namespace std;#define MAXD 1010#define MAXB 10010#define原创 2017-07-01 10:15:22 · 177 阅读 · 0 评论 -
圆环决斗
n个人站成一圈,任何两个人的胜负关系由一个矩阵给出,每次选相邻两个人决斗,负者出圈,直到只剩一人,问每个人能否经过合理安排赛程获得冠军。#include#include#include#includeusing namespace std;const int maxn=100;int g[maxn][maxn];int meet[maxn][maxn];int n;int原创 2017-07-01 18:03:05 · 278 阅读 · 0 评论 -
交错序列
在一个给定的子序列中求一个最长的子序列,该子序列中奇数位置的值大于其前驱值,偶数位置的值小于其前驱值。#include#include#includeusing namespace std;int n;int h[1010];int max[1010];int main(){ while(scanf("%d",&n),n!=0) { int i,j; int a原创 2017-07-01 22:40:20 · 996 阅读 · 0 评论 -
生成字符串
从空串出发,每次在字符串中间插入一个或多个相同的字母,插入的字母可以在头部和尾部。求出最少的次数。动态规划,逆向进行,考虑首尾。#include#include#include#include#include#include#include#includeusing namespace std;const int maxn=210;char s[maxn];int转载 2017-06-22 16:02:14 · 275 阅读 · 0 评论 -
无向图变成二分图
给出一个无向图G,图上的点有权值。要求将G组织成一个二分图,使得同侧的点之间没有边相连,并且两侧点权总和之差最小。转化为0-1背包问题。#include#include#include#include#include#include#include#includeusing namespace std;const int offset=2010;const int m转载 2017-06-22 22:12:22 · 874 阅读 · 0 评论 -
ZOJ 1602
区间动态规划。#include#include#include#include#includeusing namespace std;#define MAXINT 0x7fffffff#define maxn 110int f[110][110];int w[110];int main(){ int i,j,k,n;while(~scanf("%d",&n)){原创 2017-07-03 10:03:21 · 310 阅读 · 0 评论 -
机器人树上寻宝
给出一棵树,树上的每个节点都有权值。可以从树上任选一点,放出k个机器人,每个机器人最多走过m-1条边。要求停留的点权值和最大。动态规划算法。归并思想,归并的同时排好序。枚举步数从1到k.访问每个点的相邻节点。这里的f[i][j]代表从j点出发最多走i步的最大值。这里要注意的是归并过程中两个点相同只取一个,防止重复;若权值相同,选标号小的,这和点的遍历顺序有关,防止在标号大的点进行归转载 2017-06-23 19:20:23 · 432 阅读 · 0 评论 -
圆环取数
每次任意去除相邻两个数,去掉较小的那个,并把它们差的绝对值加起来,重复这一过程,直到剩最后一个数为止。f[i][j]代表i开始到j的最优解,max[i][j]表示i开始到j的最大值。#include#include#include#include#include#include#includeusing namespace std;const long maxn=210;原创 2017-06-24 21:52:26 · 1037 阅读 · 0 评论 -
树上取数
在树上取n个点,使得权值和最大,并且要满足条件:如果某棵子树两棵或以上的子树有点选中,那么该子树的根也必须选中。树形动态规划。max[i][j][k]代表以i为根的子树选或不选i,最多能选k个点最大收益。#include#include#include#include#include#includeusing namespace std;int map[110][11原创 2017-06-26 05:44:36 · 205 阅读 · 0 评论 -
noip 能量项链
点击打开链接#include#include#include#include#include#includeusing namespace std;int m[205][205];int n,temp,p[205];void matrixch(int p[],int n){ int i,j,k,r; for(r=2;r<=n;r++) for(i=1;i<=n;i原创 2017-07-07 08:27:31 · 528 阅读 · 0 评论