动态规划
文章平均质量分 69
qwerty_xk
算法ACM 向数据挖掘、人工智能、神经网络迈进
展开
-
hdu 1176 免费馅饼
//动态规划问题,数塔问题,从下往上进行递加 #include #include #define N 100000 int a[N+5][11]; int max1(int m,int n) { if(m>n) return m; return n; } int max2(int x,int y,int z) { if(x>y)原创 2012-06-14 12:14:26 · 733 阅读 · 0 评论 -
poj 1015 陪审团
这是一道动规题,感觉很难,下面是分析: 在遥远的国家佛罗布尼亚,嫌犯是否有罪,须由陪审团决定。陪审团是由法官从公众中挑选的。先随机挑选n 个人作为陪审团的候选人,然后再从这n 个人中选m 人组成陪审团。选m 人的办法是:控方和辩方会根据对候选人的喜欢程度,给所有候选人打分,分值从0 到20。为了公平起见,法官选出陪审团的原则是:选出的m 个人,必须满足辩方总分和控方总分的差的绝对值最小。如果转载 2012-12-29 20:12:16 · 464 阅读 · 0 评论 -
poj 1260 pearls
qwertyxk 1260 Accepted 168K 0MS C++ 585B 2012-12-30 16:49:55 动态规划题 ,这个动态规划只需要记住此式即可 dp[i]=min(dp[i],(sum[i]-sum[i-1]+10)*p[i]+dp[i-1]) 其中dp[i]是购买前i类的价钱,sum[i]为前i类物品的总数,先一起买,然后再分开购买原创 2012-12-30 17:05:27 · 319 阅读 · 0 评论 -
hdu 1022
火车进栈出栈问题,根据刘汝佳大神的思路所写出来的代码, 用计算机来模拟火车进栈出栈即得出了结果 #include #include int main() { int n; while(scanf("%d",&n)!=EOF) { char o1[15],o2[15],outof[30]; int target[15],start[15],stack[15],top=0,cou原创 2012-11-04 19:52:11 · 320 阅读 · 0 评论 -
poj 1080 human gene functions
根据算法导论上面的思想来做,采用LCS的思想,但是在这里需要变换一下状态转移方程 这个跟核苷所占得比重有关系了 状态转移方程为: c[i][j]=max(c[i-1][j-1]+value(a[i],b[j]),c[i-1][j]+value(a[i],'-'),c[i][j-1]+value('-',b[j])) 比较难的是边界条件的处理,这一点在源程序中将会有体现 #include原创 2013-01-13 18:36:07 · 328 阅读 · 0 评论 -
poj 1141 brackets sequence
设f[i][j]为从i到j这段字串达到匹配所需最少括号数。 初始状态:f[i][i] = 1; 状态转移: f[i][j] = min{f[i + 1][j - 1 | s[i]与s[j]匹配],f[i + 1][j] | s[i]为左括号,f[i][j - 1] | s[i]为右括号,min{f[i][k]+f[k][j]}} #include #include #i转载 2013-01-12 22:03:59 · 318 阅读 · 0 评论 -
poj 3181 Dollar Dayz
整数划分问题,用动态规划来做 整数划分是把一个正整数 N 拆分成一组数相加并且等于 N 的问题. 比如: 6 5 + 1 (序列) 4 + 2, 4 + 1 + 1 3 + 3, 3 + 2 + 1, 3 + 1 + 1 + 1 2 + 2 + 2, 2 + 2 + 1 + 1, 2 + 1 + 1 + 1 + 1 1 + 1 + 1 + 1 + 1 + 1 假设F(N,M)转载 2013-01-13 21:52:17 · 1116 阅读 · 2 评论 -
poj 1050 to the max
qwertyxk 1050 Accepted 272K 16MS C++ 618B 2013-01-13 12:00:27 利用以前做连续序列相加的思想,简化题目,把每一列的数行到行的和列出,得到相加结果的所有情况 在每种情况下把这些数就看成一行数,然后找这行数的连续相加最大和即可 用到的即是动规思想 max[i]=max{0,max[i-1]}+a[i]原创 2013-01-13 12:02:09 · 304 阅读 · 0 评论 -
poj 1221 单峰回文数
qwertyxk 1221 Accepted 888K 0MS C++ 798B 2013-01-14 12:01:00 先来看分析 这个题目和昨天写的3181题目是相同的,也是一个整数划分问题,于是我们可以把那个dp的方法运用过来 这个题目需要做一点点变形,分奇数和偶数来讨论 POJ 1221 的大意是:回文序列是指从左向右读和从右向左读都是一样原创 2013-01-14 12:04:31 · 1702 阅读 · 0 评论 -
poj 1276 Cash Machine
qwertyxk 1276 Accepted 584K 47MS C++ 945B 2013-01-15 14:01:27 这很明显是一个多重背包问题,直接套用背包九讲里面的思想来弄 最初用最简单朴素的方法来写,状态方程为: f[i][v]=max{f[i-1][v-k*c[i]]+k*c[i] | 0 这个解释为,第i种物品放进去有num[i]+1种选择,取原创 2013-01-15 14:23:56 · 450 阅读 · 0 评论 -
poj 1836 士兵战队 动态规划
思路: 找最长上升的子序列和最长下降的子序列,状态式分别如下 LIS[i]=max{LIS[j]}+1 ,其中0 LDS[i]=max{LDS[j]}+1,其中i 然后找到中间的位置x ,使得从0到x的最长上升子序列尽可能大,x+1到数组末尾之间的下降子序列尽可能长(注:不一定从x+1开始哦,下降子序列的最长长度,我就栽在这里) 代码如下: #include using原创 2013-10-26 15:20:33 · 1261 阅读 · 0 评论 -
poj 3267 最少需要删除多少个多余字符来匹配字典中的单词
这是一个动态规划的题,刚开始不容易想到,但是弄明白之后就很简单了,关键是在于状态规划方程 设dp[i]表示从单词开始位置到当前i位置之间至少要删除的多余字符 那么有这样一个方程 dp[i]=min{dp[i-1]+1,dp[pos+1]+(i-(pos+1)-len)}; 其中dp[i-1]+1还是很好理解的,没有匹配的单词从上一个位置递增1 然后dp[pos+1]表示匹配到字典中的单词原创 2013-10-27 17:01:03 · 845 阅读 · 0 评论 -
poj 2593 与 poj 2479
动规 #include #define INF -999999999 int arr[110005],arr_1[110005],arr_2[110005]; void get_arr(int n) { int sum=0,i,tmp=INF; for(i=0;i<n;i++) { sum+=arr[i]; if(sum>tmp) tmp=sum; arr_1[i]=t原创 2012-11-09 23:57:02 · 537 阅读 · 0 评论 -
hdu 2955
01背包问题 关键方程 f[j]=max{f[j],f[j-M[i]]*(1-P[i])} 把银行所有的钱看做背包,如果银行的钱少了,说明该盗贼没有被抓到,必须取没有被抓到的概率来进行相乘, 而不是用总的概率来减去下面各个不被抓到的分概率(这么做非常愚蠢,虽然我之前也这么想过) 然后从最大的总钱数开始遍历到0,取大于不被抓到的总概率,此时即得到了最大的可以抢劫到钱数 代码如下原创 2012-11-06 20:32:04 · 401 阅读 · 0 评论 -
hdu 1159 最长公共子序列
典型的dp问题中关于LCS的题目 只要把握如下核心 if(s1[i]==s2[j]) len[i][j]=len[i-1][j-1]+1 else len[i][j]=max(len[i-1][j],len[i][j-1]) 用一个矩阵表示,举个例子,比如programn contest p r o g r a m n原创 2012-06-15 01:27:43 · 1078 阅读 · 0 评论 -
hdu 1160 fat mouse speed
又是一个典型的dp问题,其思想可以从前面一些题目总结出来,针对这个题目,先将所有mice的体重按从小到大排列出来,速度作为第二关键字 然后执行f[i]=max(f[i],f[j]+1) 1mice[j].w mice[i].s f[i]先都被初始化为1 得到了上升序列后,取得其中最大值,输出,然后将数组按从大到小取原本次序的值存入新数组中,最后将此数组输出原创 2012-06-17 16:50:08 · 611 阅读 · 0 评论 -
hdu 1058 humble number
如果一个一个算会很困难,所以利用dp思想,每次都保存值,然后利用前面的值 f[i]=min(f[j1]*2,f[j2]*3,f[j3]*5,f[j4]*7) j1,j2,j3,j4初始都为1,每次取到其为最小值后,j系列则进行加1操作,表示以后不用重复计算,得到重复值了 #include #define N 5850 int f[N]; int mini(int a,int b原创 2012-06-21 00:57:25 · 463 阅读 · 0 评论 -
hdu 1028
if(n==m) dp[n][n]=1+dp[n][n-1] if(n dp[n][m]=dp[n][n] if(n>m) dp[n][m]=dp[n-m][m]+dp[n][m-1](分成把m分出来以及不分出来的情况) #include int dp[121][121]; void cal() { int i,j; for原创 2012-06-27 00:19:20 · 402 阅读 · 0 评论 -
Windows编程的剪贴板机制
Windows剪贴板 Windows剪贴板是一种比较简单同时也是开销比较小的IPC(IntERProcess Communication,进程间通讯)机制。Windows系统支持剪贴板IPC的基本机制是由系统预留的一块全局共享内存,用来暂存在各进程间进行交换的数据:提供数据的进程创建一个全局内存块,并将要传送的数据移到或复制到该内存块;接受数据的进程(也可以是提供数据的进程本身)获取转载 2012-06-27 22:26:26 · 572 阅读 · 0 评论 -
poj 2479
是一个动规题目 找连续自序列的最大和 但是我并没用到动规的思想,只是用了个小技巧来解决。。。 思想:从前往后找到最大和 然后从后往前找到最大和,然后取arr[i-1]+arr_rev[i]的所有值中的最大值 #include #include #define N 50000 #define INF -99999999 int a[N+10],n,arr[N+10],arr_re原创 2012-10-12 14:08:22 · 379 阅读 · 0 评论 -
hdu 2059 龟兔赛跑 动规问题
首先 这个题目我并没有用动规的思想来做,自己写了个程序 手动模拟加油与不加油的情况,并在每次取得较小值, 在样本数据中演示毫无压力,但是提交的时候WA了 , 仔细看了题干条件 猜了一些测试数据,还是没错,所以不知道哪个地方错了 还麻烦能找到特殊数据证明我这个程序错误的大大多多指教,谢谢了! 源代码如下: #include #define NUM 100 int P[NUM+1原创 2012-10-14 16:28:18 · 616 阅读 · 0 评论 -
hdu 2191
多重背包问题,用了最朴素的算法 f[i][v]=max{f[i-1][v-k*p[i]]+k*h[i]|k>=0&&k 最后积累到f[m][n],然后输出即可 时间复杂度比较高 为 O(V*(n[i]之和)) 本题还可以用二进制拆分法来做,可以大大减少时间复杂度 #include #include int p[105],h[105],c[105],f[105][105];原创 2012-11-02 22:07:26 · 450 阅读 · 0 评论 -
hdu 1503
这个是最长公共子序列的升级版,不仅需要能算出公共子序列的最大长度 还要能输出公共子序列,并且还要能把两个序列不同的地方分别输出来,这里用了算法导论的LCS算法 ,然后加上后面的输出字符的算法 通过形象的字符表来看到一个一个的字符输出,直到每个字符串的边缘值都被输出来,如此便得到了两个字符的完整合并值 这里为了表示算法的直观方便,我把数组和字符图都输出来了,便于观看效果 #include原创 2012-11-04 12:46:16 · 360 阅读 · 0 评论 -
hdu 1421
状态Dp[i][j]为前i件物品选j对的最优解 当i=j*2时,只有一种选择即 Dp[i-2][j-1]+(w[i]-w[i-1])^2 当i>j*2时,Dp[i][j] = min(Dp[i-1][j],Dp[i-2][j-1]+(w[j]-w[j-1])^2) 但是在这之前必须先得对w数组进行从小到大的排序,这里用到了快排算法 #include int w[20原创 2012-11-02 17:49:58 · 419 阅读 · 0 评论 -
hdu 1422
用动规 ,本题相当于看成循环队列的最长子序列,相加大于0 用 f[i]=f[i-1]+1 #include int a[200005],f[200005]; int main() { int n; while(scanf("%d",&n)!=EOF) { int i,j,w,l,res=0,sum=0,s; for(i=1;i { scanf("%d%d",&原创 2012-11-03 15:45:23 · 529 阅读 · 0 评论 -
构成最小回文数的分析
给定字符串,可以通过插入字符,使其变成回文,求最少插入字符的数量。 比如 poj 1159 这题 Ab5db可以最少插入两个字符 构成回文 Abd5dbA abcd可以最少插入三个字符 构成回文 abcdcba 分析: 用动态规划。 设字符为str[] ,长度为n,下标的开始为l,结束为h 那么如果str[l]==str[h] ,则只需要看str从l+1到h-1的回文如何构原创 2013-10-22 16:53:38 · 1540 阅读 · 0 评论