void-man

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

文章分类 -  动态规划(DP)+贪心

上一页 1 2

摘要:给出一些钱币的价值,都是一些完全平方数1,4,9...然后输入一个数,问你用这些完数能组成这个数的种类有多少钟?一般来讲,填充性问题都是背包的,这个也不例外,简单的完全背包问题转移方程dp[k]+=dp[k-w[i]]; k价值的种类等于(k-w[i])的种类的和View Code 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <iostream> 4 #include <limits.h> 5 #include <string.h> 6 #include <algo 阅读全文
posted @ 2011-05-07 17:06 void-man 阅读(325) 评论(0) 推荐(0)

摘要:最大杀伤力TimeLimit: 1000MS MemoryLimit: 32768 Kb Totalsubmit: 9 Accepted: 5 DescriptionBean最近一直在沉迷DNF,但因为等级比较低,所以在PK场里总会被人“虐”,于是,Bean就想进行“地狱式”的训练。Bean现在的MP值还有K点,并且具有N个技能,对于每个技能的使用,都会消耗掉MP值,当然同时也会对敌手造成一定的杀伤力。. 在目前的状况下,Bean想让你帮他规划一下,如何使用这些技能,最后对敌手造成杀伤力最大。当然,对每个技能的施放次数会有所限制的,下面就由你来帮Bean完成这个任务吧。Input第一行: N 阅读全文
posted @ 2011-05-07 16:07 void-man 阅读(253) 评论(0) 推荐(0)

摘要:给出一些牛的高度,问你把牛叠加起来的高度,超过所给的牛棚高度,并且超出的高度最小是多少直接用背包把能达到高度的牛的高度最小值保存起来,然后求解View Code 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <iostream> 4 #include <string.h> 5 #include <algorithm> 6 #include <limits.h> 7 using namespace std; 8 int w[1000002],bag[2000000 阅读全文
posted @ 2011-05-07 16:04 void-man 阅读(284) 评论(0) 推荐(0)

摘要:0-1背包,就是每个物品只有选或者不选两种情况,且只能选一次,普通背包就是每个物品可以有多种今天在重新回过头研究这个问题时候发现,这两种背包问题的代码区别就在于0-1背包在写转移方程时候要从大往小写:i=0-n,j=max-w[i] bag[j]=max( bag[j-w[i]]+v[i], bag[ j ] );这样一来,由于是从大往小的写,所以物品每次从小的添加此物品,看是否能够比现在的大,大的话就加上赋值给当前大的重量,此时小的里面还不含此物品,那么背包就不可能把每个物品使用多次普通背包:i=0-n,j=w[i]-maxbag[j]=max( bag[j-w[i]]+v[i], bag[ 阅读全文
posted @ 2011-05-07 14:32 void-man 阅读(316) 评论(0) 推荐(0)

摘要:不解释,直接上代码写循环把当前行与下一行叠加,然后用最大连续和求出此时的最大和View Code 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <iostream> 4 #include <string.h> 5 #define N 101 6 using namespace std; 7 int Maxsum(int n, int *a) 8 { 9 int sum = 0,b = 0;10 for(int i=0; i<n; i++)11 {12 if( b > 0 ) 阅读全文
posted @ 2011-05-07 14:01 void-man 阅读(111) 评论(0) 推荐(0)

摘要:写烂了的一道题了,但是木办法,还是再写一遍吧,不多说直接上代码还是老思路,新建一个数组存储当前值之前的最多递增序列个数,往前循环一遍找出最大的+1View Code 1 #include <stdio.h> 2 #include <stdlib.h> 3 int main(void) 4 { 5 int n,maxl,i,j,ncases; 6 int s[1003],max[1003],result; 7 scanf("%d",&ncases); 8 while(ncases--) 9 {10 scanf("%d",&a 阅读全文
posted @ 2011-05-07 13:29 void-man 阅读(178) 评论(0) 推荐(0)

摘要:从新开始把每种算法题目搞一遍吧,DP中的经典题目,数字三角形,求出最大的和用数组来存储,每次输入一行就往下叠加求出最大的num[i][j]+=max(num[i][j-1],num[i-1][j]);第一次接触时候分老大劲儿才理解,现在顺手就写出....(自恋下)View Code 1 #include <stdio.h> 2 #include <string.h> 3 #define MAX(a,b) (a)>(b)?(a):(b) 4 #define N 101 5 int num[N][N]; 6 int main() 7 { 8 int n,max,i,j 阅读全文
posted @ 2011-05-07 13:26 void-man 阅读(338) 评论(0) 推荐(0)

摘要:给出一些数字,要求连续几个数的平均数大于所给的数,问你最后有几种情况...首先一个比较好的解决办法就是,把每个输入的数减去所给的数,然后问题转换为,求连续数的和大于0即可运用循环枚举的话,O(n^2),超时是肯定的,所以可以想到此问题类似与求逆序对的问题,不过此题是正序对,稍作改动即可直接搬上求逆序对的模版吧#include<iostream>#include<cstdio>#include<memory.h>#include<stdio.h>using namespace std;const int MAX=100005;int s[MAX], 阅读全文
posted @ 2011-05-06 20:36 void-man 阅读(193) 评论(0) 推荐(0)

摘要:给出一组巨型的高度,问能组成的最大矩形面积是多少策略是首先往右边扫描,记录l[i]为大于第i个高度的最后一个序号然后往右边扫描,记录r[i]是往右边去大于第i个高度的最后一个序号,这样再进行下一个搜索的时候可以省时类似于之前一道 who is front of me的题#include<iostream> using namespace std; int l[100002],r[100002]; long h[100002]; int main() { int n,i,j; long long max,p; while(scanf("%d",&n),n) 阅读全文
posted @ 2011-04-21 13:30 void-man 阅读(224) 评论(0) 推荐(0)

摘要:给出一个数字序列,表示人的高度,然后问你往前看能看到到最多的人个数是几个,跟自己等高的人看不到,最后求出看到的人最多是几个明显是动态规划,关键看转移方程是什么,跟求最大递增序列挺像的起初我想的是,用一个数组保存他们的值,然后i=0 to num{往前回溯过去,直到找到比他大的数}但是这个算法有个问题,就是没想到这个算法会tml,原因就是在回溯的时候,往回寻找比他大的数特别费事,好吧,无奈网上搜了个代码,看了看感觉启发不小用一个数组来记录第一个比当前数大的数的序列,由于i<j的话比i小的肯定比j小,所以找比当前数大的第一个数的话就可以用pos数组来加速寻找了 1 #include < 阅读全文
posted @ 2011-04-20 18:48 void-man 阅读(159) 评论(0) 推荐(0)

摘要:1 #include <stdio.h> 2 #include<math.h> 3 #define N 4000001 4 int prime[N]; 5 int numm[N]; 6 int main() 7 { 8 int i, j,a,b,t; 9 for(i=2; i<N; i++)10 if(i%2) prime[i]=true;11 else prime[i]=false;12 for(i=3; i<=sqrt(N); i++)13 { if(prime[i])14 for(j=i+i; j<N; j+=i) prime[j]=false; 阅读全文
posted @ 2011-04-19 23:23 void-man 阅读(192) 评论(0) 推荐(0)

摘要:给出两个字符串,然后给出一个串要求包含两个串,并且最短...依然用LCS找出最长序列后,然后依次把其他部分加进去,special judge ,问题简单了... 1 #include <stdio.h> 2 #include <string.h> 3 #include <memory.h> 4 #define MAX(a,b) (a)>(b)?(a):(b) 5 char str1[120],str2[120]; 6 char lcs[120],result[220]; 7 int dp[105][105]; 8 int main() 9 {10 11 阅读全文
posted @ 2011-04-19 22:38 void-man 阅读(194) 评论(0) 推荐(0)

摘要:给出两篇文章,问期中最长的公共单词序列是神马?LCs问题,直接用动态规划,构造一个二维数组a[i][j]第一篇的i单词到第二篇的j单词之前所包含的公共单词个数然后i to num1 j to num2 iif( 两个单词相等)a[i][j]=a[i-1][j-1]+1 else =max(a[i-1][j],a[i][j-1]);这样最后构造出来的a[num1-1][num2-1]就是做多的单词数,然后再逆着回去找出每个单词就ok了 1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 阅读全文
posted @ 2011-04-19 22:28 void-man 阅读(233) 评论(0) 推荐(0)

摘要:给出几个数字,然后然你给中间加上+/-号,得到的结果是否有能被所给得数m整出 很明显的动态规划问题,构造一个数组a[i][j]表示前i个数字组成的数是否能被j整除,能的话就是true然后写出转移方程, for i=1 to num for j=1 to m if(a[i][j]){a[i+1][(j+num[i+1])%m]=true; a[i+1][abs(j-num[i+1])%m]=true;}另外在处理输入的数据时候,可以保留输入数据%m之后的余数即可,并且都转换成绝对值保存 1 #include <stdio.h> 2 #include <memory.h> 阅读全文
posted @ 2011-04-19 00:26 void-man 阅读(142) 评论(0) 推荐(0)

摘要:经典背包,不用题解了,直接上代码吧#include<stdio.h>int min(int x,int y){ if(x>y) return y; else return x;}int main(){ int t,n,v,x,y,i,j; int f[10001],p[501],w[501]; scanf("%d",&t); while(t--) { scanf("%d%d",&x,&y); v=y-x; scanf("%d",&n); for(i=1;i<=n;i++) sca 阅读全文
posted @ 2011-04-19 00:23 void-man 阅读(204) 评论(0) 推荐(0)

摘要:题意:一个渡河问题,船每次最多可以载n辆车,单程渡河的时间是t,有m辆车要渡河,问最少时间把所有车运过河去的时间是多少,这个情况下,最少的运输次数是多少。表示还不太懂,过几天再看看吧,先为校内比赛准备点基础的题目算了#include <iostream>#include <algorithm>using namespace std;int max(int a, int b){return a>b?a:b;}int t, n, cnt;int a[1500];int find(int p){ if(p<=n)return a[p]; else { cnt++; 阅读全文
posted @ 2011-04-19 00:18 void-man 阅读(148) 评论(0) 推荐(0)

上一页 1 2