动态规划算法(动态规划算法的基本思想)

一道编程题(老师说要用动态规划),帮忙求解,请不要超时1s

  • sum.pas两个整数之间的“距离”被定义成对应位上的数字差值的绝对值之和.例如:4561 和3278的距离为 |4 – 3| + |5 – 2| + |6 – 7| + |1 – 8| = 12. 如果其中一个整数所有的位数较少,则数的高位补0.所以32和5678 的距离为 |0 – 5| + |0 – 6| + |3 – 7| + |2 – 8| = 21.现在给你两个整数 A 和 B. 请计算区间 [A, B]中的所有数对的距离之和。输入格式:A, B(1 ≤ A≤ B≤ 10^50000).输出格式:距离和 mod 1 000 000 007.输入样例1:1 5输出样例1:40 输入样例2:288 291输出样例2:76样例解释:数对的距离分别为(288, 289) = 1, (288, 290) = 9, (288, 291) = 8, (289, 290) = 10, (289, 291) = 9, (290, 291) = 1,(289, 288) = 1, (290, 288) = 9, (291, 288) = 8, (290, 289) = 10, (291, 289) = 9, (291, 290) = 1所以总和为2 * (1 + 9 + 8 + 10 + 9 +1) = 76. 输入样例3:1000000 10000000输出样例3:581093400———————————————————————————————————————————-老师的解析是f[n]=(x-y)*num[i-1]x、y分别是两个数n位上的数字,num记录这个数位上重复的次数,答案是所有f[i]的和。我不是很懂,最好贴出源代码。
  • 看题目你要的pascal?

一道c语言动态规划题目,在行数多的情况下程序无法运行

  • 是一个比较经典的动态规划问题。一个数字组成的金字塔,其中的每一个元素(除了最后一行)与左下角或右下角的数字连接,共有2^(n-1)钟可能的路径,求使数字和最大的路径对应的数字和。这是我的代码。算法我比较清楚,但问题是在NUM为700的时候可以运行,试了9行,答案也都正确。但是设置为1000行就无法运行,直接报错。但是题目要求就是要有1000行。。确切地说,是NUM=721可以运行,NUM=722就无法运行了= =。就像下面这样。完全弄不明白是怎么回事,求各位大神指点。。#include stdio.h#include stdlib.h#define NUM 1001void assignment_pyramid(int Parray[ ][ NUM ],int height){ for (int i = 1;i = height;i++){ for (int j = 1;j = i;j++){ scanf("%d",&Parray[ i ][ j ]); } }}int calculate_pyramid(int Parray[ ][ NUM ],int height){ int max = 0; int i,j; for (i = height;i 1;i–){ for (j = 1;j i;j++){ Parray[ i-1][ j ] += (Parray[ i ][ j ] = Parray[ i ][ j+1] ? Parray[ i ][ j ] : Parray[ i ][ j+粻顶纲雇蕺概告谁梗京1]); } max = Parray[1][1]; } return max;}int main(){ int height; int Pyramid[NUM][NUM] = {{0}}; scanf("%d",&height); assignment_pyramid(Pyramid,height); printf("n%d",calculate_pyramid(Pyramid,height)); return 0;}
  • 你没看是不是越界了

C动态规划解最长公共子序列问题

  • 小弟初学者,编了这样一个代码,错误很多,还麻烦高人指出,小弟不胜感激。#includestdio.h#includestring.h# define N=100;int main(){int i,j,l1,l2,n; char str1[]="ABCBDAB"; char str2[]="BDCABA"; int dp[N][N]; l1=strlen(str1); l2=strlen(str2); int LCP(int a,int b,char*,char*,int str3) n=LCP(l1,l2,str1,str2,str3); printf("%d",n);}int max(int a,int b);{ if(ab) return a; else return b;}int LCP(int a ,int b,char*,char*,int dp){ int i=0,j=0; for(i=0;i=a;i++) {dp[i][0]=0; dp[0][i]=0;} for(i=0;i=a;i++) {for(j=0;j=b;j++) if(str1[i-1]==str2[j-1]) { dp[i][j]=dp[i-1][j-1]+1; } else dp[i][j]=max(dp[i-1][j],dp[i][j-1]); }} return dp[a][b]; }
  • 最长公共子串问题:一个给定序列的子序列是在该序列中删去若干元素后得到的序列。给定两个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的公共子序列。最长公共子串就是求给定两个序列的一个最长公共子序列。例如,X=“ABCBDAB”,Y=“BCDB”是X的一个子序列。问题分析: 给定两个序列A和B,称序列Z是A和B的公共子序列,是指Z同是A和B的子序列。问题要求已知两序列A和B的最长公共子序列。如采用列举A的所有子序列,并一一检查其是否又是B的子序列,并随时记录所发现的子序列,最终求出最长公共子序列。这种方法因耗时太多而不可取。 考虑最长公共子序列问题如何分解成子问题,设A=“a0,a1,…,am-1”,B=“b0,b1,…,bm-1”,并Z=“z0,z1,…,zk-1”为它们的最长公共子序列。不难证明有以下性质: (1) 如果am-1=bn-1,则zk-1=am-1=bn-1,且“z0,z1,…,zk-2”是“a0,a1,…,am-2”和“b0,b1,…,bn-2”的一个最长公共子序列; (2) 如果am-1!=bn-1,则若zk-1!=am-1,蕴涵“z0,z1,…,zk-1”是“a0,a1,…,am-2”和“b0,b1,…,bn-1”的一个最长公共子序列; (3) 如果am-1!=bn-1,则若zk-1!=bn-1,蕴涵“z0,z1,…,zk-1”是“a0,a1,…,am-1”和“b0,b1,…,bn-2”的一个最长公共子序列。 这样,在找A和B的公共子序列时,如有am-1=bn-1,则进一步解决一个子问题,找“a0,a1,…,am-2”和“b0,b1,…,bm-2”的一个 最长公共子序列;如果am-1!=bn-1,则要解决两个子问题,找出“a0,a1,…,am-2”和“b0,b1,…,bn-1”的一个最长公共子序列 和找出“a0,a1,…,am-1”和“b0,b1,…,bn-2”的一个最长公共子序列,再取两者中较长者作为A和B的最长公共子序列。 为了节约重复求相同子问题的时间,引入一个数组,不管它们是否对最终解有用,把所有子问题的解存于该数组中,这就是动态规划法所采用的基本方法,具体说明如下。 定义c[i][j]为序列“a0,a1,…,ai-2”和“b0,b1,…,bj-1”的最长公共子序列的长度,计算c[i][j]可递归地表述如下: (1)c[i][j] = 0 如果i=0或j=0; (2)c[i][j] = c[i-1][j-1]+1 如果i,j0,且a[i-1] = b[j-1]; (3)c[i][j] = max{c[i][j-1], c[i-1][j]} 如果i,j0,且a[i-1] != b[j-1]。 按此算式可写出计算两个序列的最长公共子序列的长度函数。由于c[i][j]的产生仅依赖于c[i-1][j-1]、c[i-1][j]和c[i][j-1],故可以从c[m][n]开始,跟踪c[i][j]的产生过程,逆向构造出最长公共子序列。本文来自CSDN博客,转载请标明出处:……余下全文

硬币问题 动态规划 c语言 编程 数学

  • 那个怎么控制正整数,大家看看我的代码该怎么改进#includequeue#includeiostream#includestring.h#includestdlib.h#includestack#includemath.h#includestdio.h#includelist#includememory.husing namespace std;int main(){ int a[12][12],b[12][12],i,j,m,n; while(cinnm!=NULL) { for(i=1;i=n;i++) { for(j=1;j=m;j++) cina[i][j]; } for(i=0;i=m;i++) a[0][i]=INFINITY; for(i=0;i=n;i++) a[0][i]=INFINITY; b[1][1]=a[1][1]; for(i=1;i=n;i++) { for(j=1;j=m;j++) { if(i==1&&j==1) 笭丹蒂柑郦纺垫尸叮建 continue; if(a[i-1][j]a[i][j-1]) b[i][j]=b[i][j-1]+a[i][j]; else b[i][j]=b[i-1][j]+a[i][j]; } } coutb[n][m]endl; } return 0;}
  • 这个题数据笭丹蒂柑郦纺垫尸叮建比较大,需要动态规划来求解。。 首先题目要求每种硬币至少有一枚,那么先取出1分,2分和5分各一枚,这样刚好是8分钱。 题目描述说了这比钱大于8分,小于1元,所以没有影响,剩下有多少种方式就动态规…

动态规划问题,求答案

  • Description 一个国家有n个城市(n不超过1000),一名旅行家住在最西边的城市里,他希望不重不漏地将每个城市浏览一遍。他的路线将是先向东经过一些城市到达最东边的城市,再向西依次经过剩余城市回到原来所在城市,任意两个城市均可直接相互到达。现给出所有城市的坐标,两个城市间的距离即为坐标两点间的直线距离。求旅行家所需走过的最短距离。Input第一行为整数n,是城市个数。接下来n行,每行两个整数x,y,表示某个城市的坐标。保证坐标在32位整数范围内。保证最西和最东只有一个城市。Output 输出最短距离,保留两位小数。给出代码
  • 热心网友 12:17

花了一天的时间了,需求帮助用 perl语言以及动态规划的方法解决一个小问题

  • 第一行1-10是id第一列a-k也是ida在1-10下所对应0或者1,其他字母也是。现在问题是,从中选择N个组合[a-k](我们假设5个好了),使得1-10所对应1最多为M个(最多10个,非冗余)。然后输出组合以及最多M个是多少。问题补充: BTW,如果不用动态规划,圆满解决问题的话。用别的也Ok。
  • 闵僧榭羑柃铉忆罗冠墉灼洮潭佘朝藤雒仉(赜涵

运筹学动态规划问题

  • 某住宅建筑公司拟建甲、乙、丙三类住宅出售。已知:甲类住宅楼每栋耗资100万元,售价200万元;乙类住宅楼每栋耗资60万元,售价110万元;丙类住宅楼每栋耗资30万元,售价70万元。由于市政当局的限制,建造每类住宅楼不得多于三栋,该公司共有可利用的资金350万元。问:应如何拟定建筑计划,方能使该公司的售房收入最大?
  • 差很多。穷举法是用人工的方法把所有的可能项全部列出,再从中挑选符合约束的最优解,是最笨的一种方法。比如说要找出从A地到D地的最短距离,就要把所有从A到D的各种不同走法的距离都写出来,看哪个最小最优解就是哪个。变量少点还勉强可以,变量一多又麻烦又容易出错。动态规划是用科学的方法按照顺序或逆序,从中间变量开始依次往后或往前迭代推算,每次选出的都是最优解。这样就避免了那些从第一节点就非最优的一系列计算,只挑最优的算。在变量较多的时候使用,可以很快很准确的得到答案。

贪心算法和动态规划,跪求代码加解释,下面是题目描述

  • 有一个数字三角形,现有一只蚂蚁从顶层开始向下走,每走下一级时,可向左下方向或右下方向走,求走到底层后他所经过的数的最大值。三角形是: 1 6 3 8 2 6 2 1 6 5 3 2 4 7 6
  • 向左下一直走是8,

求一个动态规划算法的并行计算程序

  • 求一个动态规划算法的并行计算程序不管是矩阵链乘、最长公共子序列还是最短路径还是其他都可以。。十分感谢。。追加分数。。问题补充: 最好是MPI 结合C语言实现的
  • blog.csdn.net/…550347

如果有多个约束条件,动态规划怎么做

  • DP 的优越性本来就是在 subproblem 之间的 overlapping 比较多的时候才更容易提升。 如果 constraint 过多, 那么对于 subproblem 的定义相应的也就会越来越细化, 发生 overlapping 的可能性也就格外小窢珐促貉讵股存瘫担凯, 这时候 DP 就未必有那么大的优越性了。 通用型的 constraint-based 语言类似 prolog, 最后实际上的做法就是 backtrack 来做, 多少 constraint 都可以做, 但是不保证时间。 当然如果要自己实现, 可以加上剪枝, 尤其是可以维护一个全局最大值, 来剪掉无法改变当前最大值的分枝。
版权声明

为您推荐