动态规划 动态规划的主要思路是什么?

\u52a8\u6001\u89c4\u5212\u7684\u57fa\u672c\u8981\u7d20

\u3000\u662f\u4fe1\u606f\u5b66\u7ade\u8d5b\u4e2d\u9009\u624b\u5fc5\u987b\u719f\u7ec3\u638c\u63e1\u7684\u4e00\u79cd\u7b97\u6cd5,\u4ed6\u4ee5\u5176\u591a\u5143\u6027\u5e7f\u53d7\u51fa\u9898\u8005\u7684\u559c\u7231.
\u3000\u3000\u52a8\u6001\u89c4\u5212\u9996\u6b21\u8fdb\u5165\u4fe1\u606f\u5b66\u5965\u8d5b\u662f\u5728IOI94\uff08\u6570\u5b57\u4e09\u89d2\u5f62\uff09\uff0c\u5728\u56fd\u5185\u9996\u6b21\u51fa\u73b0\u662f\u5728NOI95\u3002\u6b64\u540e\u52a8\u6001\u89c4\u5212\u6210\u4e3a\u4fe1\u606f\u5b66\u5965\u8d5b\u7684\u5fc5\u8003\u7b97\u6cd5\u4e4b\u4e00\u3002
[\u7f16\u8f91\u672c\u6bb5]\u6982\u5ff5\u53ca\u610f\u4e49
\u3000\u3000\u52a8\u6001\u89c4\u5212(dynamic programming)\u662f\u8fd0\u7b79\u5b66\u7684\u4e00\u4e2a\u5206\u652f\uff0c\u662f\u6c42\u89e3\u51b3\u7b56\u8fc7\u7a0b(decision process)\u6700\u4f18\u5316\u7684\u6570\u5b66\u65b9\u6cd5\u300220\u4e16\u7eaa50\u5e74\u4ee3\u521d\u7f8e\u56fd\u6570\u5b66\u5bb6R.E.Bellman\u7b49\u4eba\u5728\u7814\u7a76\u591a\u9636\u6bb5\u51b3\u7b56\u8fc7\u7a0b(multistep decision process)\u7684\u4f18\u5316\u95ee\u9898\u65f6\uff0c\u63d0\u51fa\u4e86\u8457\u540d\u7684\u6700\u4f18\u5316\u539f\u7406(principle of optimality)\uff0c\u628a\u591a\u9636\u6bb5\u8fc7\u7a0b\u8f6c\u5316\u4e3a\u4e00\u7cfb\u5217\u5355\u9636\u6bb5\u95ee\u9898\uff0c\u5229\u7528\u5404\u9636\u6bb5\u4e4b\u95f4\u7684\u5173\u7cfb\uff0c\u9010\u4e2a\u6c42\u89e3\uff0c\u521b\u7acb\u4e86\u89e3\u51b3\u8fd9\u7c7b\u8fc7\u7a0b\u4f18\u5316\u95ee\u9898\u7684\u65b0\u65b9\u6cd5\u2014\u2014\u52a8\u6001\u89c4\u5212\u30021957\u5e74\u51fa\u7248\u4e86\u4ed6\u7684\u540d\u8457Dynamic Programming\uff0c\u8fd9\u662f\u8be5\u9886\u57df\u7684\u7b2c\u4e00\u672c\u8457\u4f5c\u3002
\u3000\u3000\u52a8\u6001\u89c4\u5212\u95ee\u4e16\u4ee5\u6765\uff0c\u5728\u7ecf\u6d4e\u7ba1\u7406\u3001\u751f\u4ea7\u8c03\u5ea6\u3001\u5de5\u7a0b\u6280\u672f\u548c\u6700\u4f18\u63a7\u5236\u7b49\u65b9\u9762\u5f97\u5230\u4e86\u5e7f\u6cdb\u7684\u5e94\u7528\u3002\u4f8b\u5982\u6700\u77ed\u8def\u7ebf\u3001\u5e93\u5b58\u7ba1\u7406\u3001\u8d44\u6e90\u5206\u914d\u3001\u8bbe\u5907\u66f4\u65b0\u3001\u6392\u5e8f\u3001\u88c5\u8f7d\u7b49\u95ee\u9898\uff0c\u7528\u52a8\u6001\u89c4\u5212\u65b9\u6cd5\u6bd4\u7528\u5176\u5b83\u65b9\u6cd5\u6c42\u89e3\u66f4\u4e3a\u65b9\u4fbf\u3002
\u3000\u3000\u867d\u7136\u52a8\u6001\u89c4\u5212\u4e3b\u8981\u7528\u4e8e\u6c42\u89e3\u4ee5\u65f6\u95f4\u5212\u5206\u9636\u6bb5\u7684\u52a8\u6001\u8fc7\u7a0b\u7684\u4f18\u5316\u95ee\u9898\uff0c\u4f46\u662f\u4e00\u4e9b\u4e0e\u65f6\u95f4\u65e0\u5173\u7684\u9759\u6001\u89c4\u5212(\u5982\u7ebf\u6027\u89c4\u5212\u3001\u975e\u7ebf\u6027\u89c4\u5212)\uff0c\u53ea\u8981\u4eba\u4e3a\u5730\u5f15\u8fdb\u65f6\u95f4\u56e0\u7d20\uff0c\u628a\u5b83\u89c6\u4e3a\u591a\u9636\u6bb5\u51b3\u7b56\u8fc7\u7a0b\uff0c\u4e5f\u53ef\u4ee5\u7528\u52a8\u6001\u89c4\u5212\u65b9\u6cd5\u65b9\u4fbf\u5730\u6c42\u89e3\u3002
\u3000\u3000\u52a8\u6001\u89c4\u5212\u7a0b\u5e8f\u8bbe\u8ba1\u662f\u5bf9\u89e3\u6700\u4f18\u5316\u95ee\u9898\u7684\u4e00\u79cd\u9014\u5f84\u3001\u4e00\u79cd\u65b9\u6cd5\uff0c\u800c\u4e0d\u662f\u4e00\u79cd\u7279\u6b8a\u7b97\u6cd5\u3002\u4e0d\u8c61\u524d\u9762\u6240\u8ff0\u7684\u90a3\u4e9b\u641c\u7d22\u6216\u6570\u503c\u8ba1\u7b97\u90a3\u6837\uff0c\u5177\u6709\u4e00\u4e2a\u6807\u51c6\u7684\u6570\u5b66\u8868\u8fbe\u5f0f\u548c\u660e\u786e\u6e05\u6670\u7684\u89e3\u9898\u65b9\u6cd5\u3002\u52a8\u6001\u89c4\u5212\u7a0b\u5e8f\u8bbe\u8ba1\u5f80\u5f80\u662f\u9488\u5bf9\u4e00\u79cd\u6700\u4f18\u5316\u95ee\u9898\uff0c\u7531\u4e8e\u5404\u79cd\u95ee\u9898\u7684\u6027\u8d28\u4e0d\u540c\uff0c\u786e\u5b9a\u6700\u4f18\u89e3\u7684\u6761\u4ef6\u4e5f\u4e92\u4e0d\u76f8\u540c\uff0c\u56e0\u800c\u52a8\u6001\u89c4\u5212\u7684\u8bbe\u8ba1\u65b9\u6cd5\u5bf9\u4e0d\u540c\u7684\u95ee\u9898\uff0c\u6709\u5404\u5177\u7279\u8272\u7684\u89e3\u9898\u65b9\u6cd5\uff0c\u800c\u4e0d\u5b58\u5728\u4e00\u79cd\u4e07\u80fd\u7684\u52a8\u6001\u89c4\u5212\u7b97\u6cd5\uff0c\u53ef\u4ee5\u89e3\u51b3\u5404\u7c7b\u6700\u4f18\u5316\u95ee\u9898\u3002\u56e0\u6b64\u8bfb\u8005\u5728\u5b66\u4e60\u65f6\uff0c\u9664\u4e86\u8981\u5bf9\u57fa\u672c\u6982\u5ff5\u548c\u65b9\u6cd5\u6b63\u786e\u7406\u89e3\u5916\uff0c\u5fc5\u987b\u5177\u4f53\u95ee\u9898\u5177\u4f53\u5206\u6790\u5904\u7406\uff0c\u4ee5\u4e30\u5bcc\u7684\u60f3\u8c61\u529b\u53bb\u5efa\u7acb\u6a21\u578b\uff0c\u7528\u521b\u9020\u6027\u7684\u6280\u5de7\u53bb\u6c42\u89e3\u3002\u6211\u4eec\u4e5f\u53ef\u4ee5\u901a\u8fc7\u5bf9\u82e5\u5e72\u6709\u4ee3\u8868\u6027\u7684\u95ee\u9898\u7684\u52a8\u6001\u89c4\u5212\u7b97\u6cd5\u8fdb\u884c\u5206\u6790\u3001\u8ba8\u8bba\uff0c\u9010\u6e10\u5b66\u4f1a\u5e76\u638c\u63e1\u8fd9\u4e00\u8bbe\u8ba1\u65b9\u6cd5\u3002
[\u7f16\u8f91\u672c\u6bb5]\u57fa\u672c\u6a21\u578b
\u3000\u3000
\u3000\u3000\u591a\u9636\u6bb5\u51b3\u7b56\u8fc7\u7a0b\u7684\u6700\u4f18\u5316\u95ee\u9898\u3002
\u3000\u3000\u5728\u73b0\u5b9e\u751f\u6d3b\u4e2d\uff0c\u6709\u4e00\u7c7b\u6d3b\u52a8\u7684\u8fc7\u7a0b\uff0c\u7531\u4e8e\u5b83\u7684\u7279\u6b8a\u6027\uff0c\u53ef\u5c06\u8fc7\u7a0b\u5206\u6210\u82e5\u5e72\u4e2a\u4e92\u76f8\u8054\u7cfb\u7684\u9636\u6bb5\uff0c\u5728\u5b83\u7684\u6bcf\u4e00\u9636\u6bb5\u90fd\u9700\u8981\u4f5c\u51fa\u51b3\u7b56\uff0c\u4ece\u800c\u4f7f\u6574\u4e2a\u8fc7\u7a0b\u8fbe\u5230\u6700\u597d\u7684\u6d3b\u52a8\u6548\u679c\u3002\u5f53\u7136\uff0c\u5404\u4e2a\u9636\u6bb5\u51b3\u7b56\u7684\u9009\u53d6\u4e0d\u662f\u4efb\u610f\u786e\u5b9a\u7684\uff0c\u5b83\u4f9d\u8d56\u4e8e\u5f53\u524d\u9762\u4e34\u7684\u72b6\u6001\uff0c\u53c8\u5f71\u54cd\u4ee5\u540e\u7684\u53d1\u5c55\uff0c\u5f53\u5404\u4e2a\u9636\u6bb5\u51b3\u7b56\u786e\u5b9a\u540e\uff0c\u5c31\u7ec4\u6210\u4e00\u4e2a\u51b3\u7b56\u5e8f\u5217\uff0c\u56e0\u800c\u4e5f\u5c31\u786e\u5b9a\u4e86\u6574\u4e2a\u8fc7\u7a0b\u7684\u4e00\u6761\u6d3b\u52a8\u8def\u7ebf\uff0c\u5982\u56fe\u6240\u793a\uff1a\uff08\u770b\u8bcd\u6761\u56fe\uff09
\u3000\u3000\u8fd9\u79cd\u628a\u4e00\u4e2a\u95ee\u9898\u770b\u4f5c\u662f\u4e00\u4e2a\u524d\u540e\u5173\u8054\u5177\u6709\u94fe\u72b6\u7ed3\u6784\u7684\u591a\u9636\u6bb5\u8fc7\u7a0b\u5c31\u79f0\u4e3a\u591a\u9636\u6bb5\u51b3\u7b56\u8fc7\u7a0b\uff0c\u8fd9\u79cd\u95ee\u9898\u5c31\u79f0\u4e3a\u591a\u9636\u6bb5\u51b3\u7b56\u95ee\u9898\u3002
[\u7f16\u8f91\u672c\u6bb5]\u8bb0\u5fc6\u5316\u641c\u7d22
\u3000\u3000\u7ed9\u4f60\u4e00\u4e2a\u6570\u5b57\u4e09\u89d2\u5f62, \u5f62\u5f0f\u5982\u4e0b:
\u3000\u30001
\u3000\u30002 3
\u3000\u30004 5 6
\u3000\u30007 8 9 10
\u3000\u3000\u627e\u51fa\u4ece\u7b2c\u4e00\u5c42\u5230\u6700\u540e\u4e00\u5c42\u7684\u4e00\u6761\u8def,\u4f7f\u5f97\u6240\u7ecf\u8fc7\u7684\u6743\u503c\u4e4b\u548c\u6700\u5c0f\u6216\u8005\u6700\u5927.
\u3000\u3000\u65e0\u8bba\u5bf9\u4e0e\u65b0\u624b\u8fd8\u662f\u8001\u624b\uff0c\u8fd9\u90fd\u662f\u518d\u719f\u6089\u4e0d\u8fc7\u7684\u9898\u4e86\uff0c\u5f88\u5bb9\u6613\u5730\uff0c\u6211\u4eec\u5199\u51fa\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\uff1af(i, j)=a[i, j] + min{f(i+1, j)\uff0cf(i+1, j + 1)}
\u3000\u3000\u5bf9\u4e8e\u52a8\u6001\u89c4\u5212\u7b97\u6cd5\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\uff0c\u6211\u4eec\u6839\u636e\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u548c\u72b6\u6001\u8f6c\u79fb\u65b9\u5411\uff0c\u6bd4\u8f83\u5bb9\u6613\u5730\u5199\u51fa\u52a8\u6001\u89c4\u5212\u7684\u5faa\u73af\u8868\u793a\u65b9\u6cd5\u3002\u4f46\u662f\uff0c\u5f53\u72b6\u6001\u548c\u8f6c\u79fb\u975e\u5e38\u590d\u6742\u7684\u65f6\u5019\uff0c\u4e5f\u8bb8\u5199\u51fa\u5faa\u73af\u5f0f\u7684\u52a8\u6001\u89c4\u5212\u5c31\u4e0d\u662f\u90a3\u4e48\u7b80\u5355\u4e86\u3002

\u52a8\u6001\u89c4\u5212\u9996\u5148\u9700\u8981\u627e\u51c6\u5b50\u95ee\u9898\uff0c\u7136\u540e\u5b9a\u4e49\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b

这是我们计算机系算法设计课的实验课程,下面是动态规划内容:

实验四:动态规划
实验目的:理解动态规划的基本思想,理解动态规划算法的两个基本要素最优子结构性质和子问题的重叠性质。熟练掌握典型的动态规划问题。掌握动态规划思想分析问题的一般方法,对较简单的问题能正确分析,设计出动态规划算法,并能快速编程实现。
实验内容:编程实现讲过的例题:最长公共子序列问题、矩阵连乘问题、凸多边形最优三角剖分问题、电路布线问题等。本实验中的问题,设计出算法并编程实现。
习题
1. 最长公共子序列
一个给定序列的子序列是在该序列中删去若干元素后得到的序列。确切地说,若给定序列X=<x1, x2,…, xm>,则另一序列Z=<z1, z2,…, zk>是X的子序列是指存在一个严格递增的下标序列 <i1, i2,…, ik>,使得对于所有j=1,2,…,k有

解答如下:
a) 最长公共子序列的结构
若用穷举搜索法,耗时太长,算法需要指数时间。
易证最长公共子序列问题也有最优子结构性质
设序列X=<x1, x2, …, xm>和Y=<y1, y2, …, yn>的一个最长公共子序列Z=<z1, z2, …, zk>,则:
i. 若xm=yn,则zk=xm=yn且Zk-1是Xm-1和Yn-1的最长公共子序列;
ii. 若xm≠yn且zk≠xm ,则Z是Xm-1和Y的最长公共子序列;
iii. 若xm≠yn且zk≠yn ,则Z是X和Yn-1的最长公共子序列。
其中Xm-1=<x1, x2, …, xm-1>,Yn-1=<y1, y2, …, yn-1>,Zk-1=<z1, z2, …, zk-1>。
最长公共子序列问题具有最优子结构性质。
b) 子问题的递归结构
由最长公共子序列问题的最优子结构性质可知,要找出X=<x1, x2, …, xm>和Y=<y1, y2, …, yn>的最长公共子序列,可按以下方式递归地进行:当xm=yn时,找出Xm-1和Yn-1的最长公共子序列,然后在其尾部加上xm(=yn)即可得X和Y的一个最长公共子序列。当xm≠yn时,必须解两个子问题,即找出Xm-1和Y的一个最长公共子序列及X和Yn-1的一个最长公共子序列。这两个公共子序列中较长者即为X和Y的一个最长公共子序列。
由此递归结构容易看到最长公共子序列问题具有子问题重叠性质。例如,在计算X和Y的最长公共子序列时,可能要计算出X和Yn-1及Xm-1和Y的最长公共子序列。而这两个子问题都包含一个公共子问题,即计算Xm-1和Yn-1的最长公共子序列。
我们来建立子问题的最优值的递归关系。用c[i,j]记录序列Xi和Yj的最长公共子序列的长度。其中Xi=<x1, x2, …, xi>,Yj=<y1, y2, …, yj>。当i=0或j=0时,空序列是Xi和Yj的最长公共子序列,故c[i,j]=0。建立递归关系如下:

c) 计算最优值
由于在所考虑的子问题空间中,总共只有θ(m*n)个不同的子问题,因此,用动态规划算法自底向上地计算最优值能提高算法的效率。
计算最长公共子序列长度的动态规划算法LCS_LENGTH(X,Y)以序列X=<x1, x2, …, xm>和Y=<y1, y2, …, yn>作为输入。输出两个数组c[0..m ,0..n]和b[1..m ,1..n]。其中c[i,j]存储Xi与Yj的最长公共子序列的长度,b[i,j]记录指示c[i,j]的值是由哪一个子问题的解达到的,这在构造最长公共子序列时要用到。最后,X和Y的最长公共子序列的长度记录于c[m,n]中。
程序如下:
#include<stdio.h>
#include<string.h>
int lcs_length(char x[], char y[]);
int main()
{
char x[100],y[100];
int len;
while(1)
{
scanf("%s%s",x,y);
if(x[0]=='0') //约定第一个字符串以‘0’开始表示结束
break;
len=lcs_length(x,y);
printf("%d\n",len);
}
}
int lcs_length(char x[], char y[] )
{
int m,n,i,j,l[100][100];
m=strlen(x);
n=strlen(y);
for(i=0;i<m+1;i++)
l[i][0]=0;
for(j=0;j<n+1;j++)
l[0][j]=0;
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
if(x[i-1]==y[j-1]) //i,j从1开始,但字符串是从0开始
l[i][j]=l[i-1][j-1]+1;
else if(l[i][j-1]>l[i-1][j])
l[i][j]=l[i][j-1];
else
l[i][j]=l[i-1][j];
return l[m][n];
}
由于每个数组单元的计算耗费Ο(1)时间,算法lcs_length耗时Ο(mn)。
思考:空间能节约吗?
2. 计算矩阵连乘积
在科学计算中经常要计算矩阵的乘积。矩阵A和B可乘的条件是矩阵A的列数等于矩阵B的行数。若A是一个p×q的矩阵,B是一个q×r的矩阵,则其乘积C=AB是一个p×r的矩阵。由该公式知计算C=AB总共需要pqr次的数乘。其标准计算公式为:

现在的问题是,给定n个矩阵{A1,A2,…,An}。其中Ai与Ai+1是可乘的,i=1,2,…,n-1。要求计算出这n个矩阵的连乘积A1A2…An。
递归公式:
程序如下:
#include<stdio.h>
int main()
{
int p[101],i,j,k,r,t,n;
int m[101][101]; //为了跟讲解时保持一致数组从1开始
int s[101][101]; //记录从第i到第j个矩阵连乘的断开位置
scanf("%d",&n);
for(i=0;i<=n;i++)
scanf("%d",&p[i]); //读入p[i]的值(注意:p[0]到p[n]共n+1项)
for(i=1;i<=n;i++) //初始化m[i][i]=0
m[i][i]=0;
for(r=1;r<n;r++) //r为i、j相差的值
for(i=1;i<n;i++) //i为行
{
j=i+r; //j为列
m[i][j]=m[i+1][j]+p[i-1]*p[i]*p[j]; //给m[i][j]赋初值
s[i][j]=i;
for(k=i+1;k<j;k++)
{
t=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];
if(t<m[i][j])
{
m[i][j]=t; //m[i][j]取最小值
s[i][j]=k;
}
}
}
printf("%d",m[1][n]);
}
3. 凸多边形的最优三角剖分
多边形是平面上一条分段线性的闭曲线。也就是说,多边形是由一系列首尾相接的直线段组成的。组成多边形的各直线段称为该多边形的边。多边形相接两条边的连接点称为多边形的顶点。若多边形的边之间除了连接顶点外没有别的公共点,则称该多边形为简单多边形。一个简单多边形将平面分为3个部分:被包围在多边形内的所有点构成了多边形的内部;多边形本身构成多边形的边界;而平面上其余的点构成了多边形的外部。当一个简单多边形及其内部构成一个闭凸集时,称该简单多边形为凸多边形。也就是说凸多边形边界上或内部的任意两点所连成的直线段上所有的点均在该凸多边形的内部或边界上。
通常,用多边形顶点的逆时针序列来表示一个凸多边形,即P=<v0 ,v1 ,… ,vn-1>表示具有n条边v0v1,v1v2,… ,vn-1vn的一个凸多边形,其中,约定v0=vn 。
若vi与vj是多边形上不相邻的两个顶点,则线段vivj称为多边形的一条弦。弦 将多边形分割成凸的两个子多边形<vi ,vi+1 ,… ,vj>和<vj ,vj+1 ,… ,vi>。多边形的三角剖分是一个将多边形分割成互不重迭的三角形的弦的集合T。如图是一个凸多边形的两个不同的三角剖分。

凸多边形最优三角剖分的问题是:给定一个凸多边形P=<v0 ,v1 ,… ,vn-1>以及定义在由多边形的边和弦组成的三角形上的权函数ω。要求确定该凸多边形的一个三角剖分,使得该三角剖分对应的权即剖分中诸三角形上的权之和为最小。
可以定义三角形上各种各样的权函数W。例如:定义ω(△vivjvk)=|vivj|+|vivk|+|vkvj|,其中,|vivj|是点vi到vj的欧氏距离。相应于此权函数的最优三角剖分即为最小弦长三角剖分。(注意:解决此问题的算法必须适用于任意的权函数)
4. 防卫导弹
一种新型的防卫导弹可截击多个攻击导弹。它可以向前飞行,也可以用很快的速度向下飞行,可以毫无损伤地截击进攻导弹,但不可以向后或向上飞行。但有一个缺点,尽管它发射时可以达到任意高度,但它只能截击比它上次截击导弹时所处高度低或者高度相同的导弹。现对这种新型防卫导弹进行测试,在每一次测试中,发射一系列的测试导弹(这些导弹发射的间隔时间固定,飞行速度相同),该防卫导弹所能获得的信息包括各进攻导弹的高度,以及它们发射次序。现要求编一程序,求在每次测试中,该防卫导弹最多能截击的进攻导弹数量,一个导弹能被截击应满足下列两个条件之一:
a)它是该次测试中第一个被防卫导弹截击的导弹;
b)它是在上一次被截击导弹的发射后发射,且高度不大于上一次被截击导弹的高度的导弹。
输入数据:第一行是一个整数n,以后的n各有一个整数表示导弹的高度。
输出数据:截击导弹的最大数目。
分析:定义l[i]为选择截击第i个导弹,从这个导弹开始最多能截击的导弹数目。
由于选择了第i枚导弹,所以下一个要截击的导弹j的高度要小于等于它的高度,所以l[i]应该等于从i+1到n的每一个j,满足h[j]<=h[i]的j中l[j]的最大值。
程序如下:
#include<stdio.h>
int main()
{
int i,j,n,max,h[100],l[100];
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&h[i]);
l[n-1]=1;
for(i=n-2;i>=0;i--)
{
max=0;
for(j=i+1;j<n;j++)
if(h[i]>h[j]&&max<l[j])
max=l[j];
l[i]=max+1;
}
printf("%d",l[0]);
}
5. 石子合并
在一个圆形操场的四周摆放着n堆石子(n<= 100),现要将石子有次序地合并成一堆。规定每次只能选取相邻的两堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。编一程序,由文件读入堆栈数n及每堆栈的石子数(<=20)。
选择一种合并石子的方案,使得做n-1次合并,得分的总和最小;
输入数据:
第一行为石子堆数n;
第二行为每堆的石子数,每两个数之间用一个空格分隔。
输出数据:
从第一至第n行为得分最小的合并方案。第n+1行是空行.从第n+2行到第2n+1行是得分最大合并方案。每种合并方案用n行表示,其中第i行(1<=i<=n)表示第i次合并前各堆的石子数(依顺时针次序输出,哪一堆先输出均可)。要求将待合并的两堆石子数以相应的负数表示。
Sample Input
4
4 5 9 4
Sample Output
-4 5 9 -4
-8 -5 9
-13 -9
22 4 -5 -9 4
4 -14 -4
-4 -18
22

6. 最小代价子母树
设有一排数,共n个,例如:22 14 7 13 26 15 11。任意2个相邻的数可以进行归并,归并的代价为该两个数的和,经过不断的归并,最后归为一堆,而全部归并代价的和称为总代价,给出一种归并算法,使总代价为最小。
输入、输出数据格式与“石子合并”相同。
Sample Input
4
12 5 16 4
Sample Output
-12 -5 16 4
17 -16 -4
-17 -20
37
7. 商店购物
某商店中每种商品都有一个价格。例如,一朵花的价格是2 ICU(ICU 是信息学竞赛的货币的单位);一个花瓶的价格是5 ICU。为了吸引更多的顾客,商店提供了特殊优惠价。特殊优惠商品是把一种或几种商品分成一组。并降价销售。例如:3朵花的价格不是6而是5 ICU;2个花瓶加1朵花是10 ICU不是12 ICU。
编一个程序,计算某个顾客所购商品应付的费用。要充分利用优惠价以使顾客付款最小。请注意,你不能变更顾客所购商品的种类及数量,即使增加某些商品会使付款总数减小也不允许你作出任何变更。假定各种商品价格用优惠价如上所述,并且某顾客购买物品为:3朵花和2个花瓶。那么顾客应付款为14 ICU因为:
1朵花加2个花瓶优惠价:10 ICU
2朵花正常价:4 ICU
输入数据:第一个文件INPUT.TXT描述顾客所购物品(放在购物筐中);第二个文件描述商店提供的优惠商品及价格(文件名为OFF ER.TXT)。 两个文件中都只用整数。
第一个文件INPUT.TXT的格式为:第一行是一个数字B(0≤B≤5),表示所购商品种类数。下面共B行,每行中含3个数C,K,P。 C 代表商品的编码(每种商品有一个唯一的编码),1≤C≤999。K代表该种商品购买总数,1≤K≤5。P 是该种商品的正常单价(每件商品的价格),1≤P≤999。请注意,购物筐中最多可放5*5=25件商品。
第二个文件OFFER.TXT的格式为:第一行是一个数字S(0≤S≤9 9),表示共有S 种优惠。下面共S行,每一行描述一种优惠商品的组合中商品的种类。下面接着是几个数字对(C,K),其中C代表商品编码,1≤C≤9 99。K代表该种商品在此组合中的数量,1≤K≤5。本行最后一个数字P(1≤ P≤9999)代表此商品组合的优惠价。当然, 优惠价要低于该组合中商品正常价之总和。
输出数据:在输出文件OUTPUT.TXT中写 一个数字(占一行),该数字表示顾客所购商品(输入文件指明所购商品)应付的最低货款。
8. 旅游预算
一个旅行社需要估算乘汽车从某城市到另一城市的最小费用,沿路有若干加油站,每个加油站收费不一定相同。旅游预算有如下规则:
若油箱的油过半,不停车加油,除非油箱中的油不可支持到下一站;每次加油时都加满;在一个加油站加油时,司机要花费2元买东西吃;司机不必为其他意外情况而准备额外的油;汽车开出时在起点加满油箱;计算精确到分(1元=100分)。编写程序估计实际行驶在某路线所需的最小费用。
输入数据:从当前目录下的文本文件“route.dat”读入数据。按以下格式输入若干旅行路线的情况:
第一行为起点到终点的距离(实数)
第二行为三个实数,后跟一个整数,每两个数据间用一个空格隔开。其中第一个数为汽车油箱的容量(升),第二个数是每升汽油行驶的公里数,第三个数是在起点加满油箱的费用,第四个数是加油站的数量。(〈=50)。接下去的每行包括两个实数,每个数据之间用一个空格分隔,其中第一个数是该加油站离起点的距离,第二个数是该加油站每升汽油的价格(元/升)。加油站按它们与起点的距离升序排列。所有的输入都有一定有解。
输出数据:答案输出到当前目录下的文本文件“route.out”中。该文件包括两行。第一行为一个实数和一个整数,实数为旅行的最小费用,以元为单位,精确到分,整数表示途中加油的站的N。第二行是N个整数,表示N个加油的站的编号,按升序排列。数据间用一个空格分隔,此外没有多余的空格。
Sample Input
516.3 38.09 1
15.7 22.1 20.87 3 2
125.4 1.259
297.9 1.129
345.2 0.999
Sample Output
38.09 1
2
9. 皇宫看守
太平王世子事件后,陆小凤成了皇上特聘的御前一品侍卫。皇宫以午门为起点,直到后宫嫔妃们的寝宫,呈一棵树的形状;某些宫殿间可以互相望见。大内保卫森严,三步一岗,五步一哨,每个宫殿都要有人全天候看守,在不同的宫殿安排看守所需的费用不同。可是陆小凤手上的经费不足,无论如何也没法在每个宫殿都安置留守侍卫。
请你编程计算帮助陆小凤布置侍卫,在看守全部宫殿的前提下,使得花费的经费最少。
输入数据:输入数据由文件名为intput.txt的文本文件提供。输入文件中数据表示一棵树,描述如下:
第1行 n,表示树中结点的数目。
第2行至第n+1行,每行描述每个宫殿结点信息,依次为:该宫殿结点标号i(0<i<=n),在该宫殿安置侍卫所需的经费k,该边的儿子数m,接下来m个数,分别是这个节点的m个儿子的标号r1,r2,...,rm。
对于一个n(0 < n <= 1500)个结点的树,结点标号在1到n之间,且标号不重复。
输出数据:输出到output.txt文件中。输出文件仅包含一个数,为所求的最少的经费。
如右图的输入数据示例:
Sample Input
6
1 30 3 2 3 4
2 16 2 5 6
3 5 0
4 4 0
5 11 0
6 5 0
Sample Output
25
10. 游戏室问题
有一个游戏室里有多个游戏室,并且这每个游戏室里还有多个游戏室,每个游戏室里面还有游戏室,依此类推。进入每个游戏室都可得到一定的快乐,每个游戏室的门票价格都大于等于0,都有一个快乐值,并且只有进入了一个游戏室,才可以进入它内部的游戏室,小明现在有n元钱,问最大能得到多少的快乐。
11. *基因问题
已知两个基因序列如s:AGTAGT;t:ATTAG。现要你给序列中增加一些空格后,首先使得两个序列的长度相等,其次两个串对应符号匹配得到的值最大。基因只有四种分别用A、G、C、T表示,匹配中不允许两个空格相对应,任意两符号的匹配值由下表给出:
A G C T 〕
A 5 -2 -1 -2 -4
G -2 5 -4 -3 -2
C -1 -4 5 -5 -1
T -2 -3 -5 5 -2
〕 -4 -2 -1 -2
提示:定义问题l[i][j]为取第一个序列的前i项,和第二个序列的前j项,这两个序列加空格匹配的最大值。它的最优值与三个子问题有关,l[i-1][j-1]、l[i][j-1]、l[i-1][j]。
建立递归公式如下:

其中m[0][t[j]表示表中空格和t[j]匹配的对应值。
思考:本问题的初始化。
12. *田忌赛马
田忌与齐王赛马,双方各有n匹马参赛(n<=100),每场比赛赌注为1两黄金,现已知齐王与田忌的每匹马的速度,并且齐王肯定是按马的速度从快到慢出场,现要你写一个程序帮助田忌计算他最好的结果是赢多少两黄金(输用负数表示)。
分析:先排序,齐王的马的速度放在数组a中,田忌的马的速度放在数组b中。本问题应用的算法是动态规划和贪心算法相结合解决的。从两人的最弱的马入手:
若田忌的马快,就让这两匹马比赛;
若田忌的马慢,干脆就让他对付齐王最快的马;
若两匹马的速度相等,这时有两种选择方案,或者它俩比赛,或者对付齐王最快的马。
定义子问题:l(i,j)为齐王的从第i匹马开始的j匹马与田忌的最快的j匹马比赛,田忌所获得的最大收益。
则:
程序具体实现时,为了适合c数据从0开始,稍加变动,定义子问题:l(i,j)为齐王的从第i匹马开始到第i+j匹马共j+1匹马与田忌的最快的j+1匹马比赛,田忌所获得的最大收益。初始化时:l[i][0]表示齐王的第i匹马与田忌最快的马比赛的结果。
程序如下:
#include<stdio.h>
void readdata();
void init();
int n,a[100],b[100],l[100][100];
int main()
{
int i,j;
readdata();
init();
for(i=n-2;i>=0;i--)
for(j=1;j<n-i;j++)
if(a[i+j]<b[j])
l[i][j]=l[i][j-1]+1;
else if(a[i+j]>b[j])
l[i][j]=l[i+1][j-1]-1;
else if(l[i+1][j-1]-1>l[i][j-1])
l[i][j]=l[i+1][j-1]-1;
else
l[i][j]=l[i][j-1];
printf("%d",l[0][n-1]);
}
void readdata()
{
int i;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<n;i++)
scanf("%d",&b[i]);
}
void init()
{
int i;
// qsort(a,n); //略
for(i=0;i<n;i++)
{
if(a[i]<b[0])
l[i][0]=1;
else if(a[i]==b[0])
l[i][0]=0;
else
l[i][0]=-1;
}
}

你可以试试找找石家庄二中的贾志毫的动态规划总结。
这个东东很不错。

  • 浠涔堟槸鍔ㄦ佽鍒(Dynamic Programming)?鍔ㄦ佽鍒掔殑鎰忎箟鏄粈涔?_鐧惧害...
    绛旓細鍔ㄦ佽鍒鏄繍绛瑰鐨勪竴涓垎鏀紝鏄眰瑙e喅绛栬繃绋嬫渶浼樺寲鐨勮繃绋嬨20涓栫邯50骞翠唬鍒濓紝缇庡浗鏁板瀹惰礉灏旀浖锛圧.Bellman锛夌瓑浜哄湪鐮旂┒澶氶樁娈靛喅绛栬繃绋嬬殑浼樺寲闂鏃讹紝鎻愬嚭浜嗚憲鍚嶇殑鏈浼樺寲鍘熺悊锛屼粠鑰屽垱绔嬩簡鍔ㄦ佽鍒掋傛剰涔夛細濡傛灉涓绫绘椿鍔ㄨ繃绋嬪彲浠ュ垎涓鸿嫢骞蹭釜浜掔浉鑱旂郴鐨勯樁娈碉紝鍦ㄦ瘡涓涓樁娈甸兘闇浣滃嚭鍐崇瓥锛堥噰鍙栨帾鏂斤級锛屼竴涓樁娈电殑鍐...
  • 浠涔堟槸鍔ㄦ佽鍒鐨勫熀鏈師鐞?
    绛旓細鍔ㄦ佽鍒鏄竴绉嶈В鍐冲闃舵鍐崇瓥闂鐨勭畻娉曟濇兂锛屽畠鍏锋湁浠ヤ笅鍩烘湰瑕佺礌锛氭渶浼樺瓙缁撴瀯锛圤ptimal Substructure锛夛細闂鐨勬渶浼樿В鍖呭惈浜嗗叾瀛愰棶棰樼殑鏈浼樿В銆傛崲鍙ヨ瘽璇达紝闂鍙互閫氳繃瀛愰棶棰樼殑鏈浼樿В鏋勫缓鍑烘暣浣撶殑鏈浼樿В銆傚姩鎬佽鍒掗棶棰 閲嶅彔瀛愰棶棰橈紙Overlapping Subproblems锛夛細闂鐨勫瓙闂涔嬮棿瀛樺湪閲嶅彔锛屽嵆鍚屼竴涓瓙闂鍙...
  • 鍏充簬鍔ㄦ佽鍒鐨勬弿杩,涓嶆纭殑鏄( )銆
    绛旓細鍑哄喅绛栵紝浠庤屼娇鏁翠釜杩囩▼杈惧埌鏈浼樺寲銆傦紙姝g‘锛堿銆鍔ㄦ佽鍒娉曟槸鍐崇瓥鍒嗘瀽涓殑涓绉嶅父鐢ㄦ柟娉曪紝鏄В鍐冲闃舵鍐崇瓥杩囩▼闂鐨勨旂鏈浼 B銆佸姩鎬佽鍒掔殑瀹炶川鏄垎娌绘濇兂鍜岃В鍐冲啑浣欙紝鍔ㄦ佽鍒掓硶涓庡垎娌绘硶鍜岃椽蹇冩硶绫讳技锛屽畠浠兘鏄皢闂瀹炰緥褰掔撼涓烘洿灏忕殑銆佺浉浼肩殑瀛愰棶棰橈紝骞堕氳繃姹傝В瀛愰棶棰樹骇鐢熶竴涓叏灞鏈浼樿В銆傦紙閿欒锛塁...
  • 鍔ㄦ佽鍒涓殑鐘舵佽浆绉绘柟绋,鎸囩殑鏄叾绗琻+1闃舵鐘舵佹槸鐢辩n闃舵鐨勭姸鎬佸拰...
    绛旓細绗琻+1闃舵鐨勭姸鎬佹槸鐢辩n闃舵鐨勭姸鎬佸拰鍐崇瓥鎵鍐冲畾鐨,鍏舵柟绋嬭〃杈惧紡绉颁负鐘舵佽浆绉绘柟绋嬨傛纭鍔ㄦ佽鍒锛圖ynamic Programming锛孌P锛夋槸杩愮瀛︾殑涓涓垎鏀紝鏄眰瑙 鍐崇瓥杩囩▼鏈浼樺寲 鐨勮繃绋嬨20涓栫邯50骞翠唬鍒濓紝缇庡浗鏁板瀹惰礉灏旀浖锛圧.Bellman锛夌瓑浜哄湪鐮旂┒澶氶樁娈靛喅绛栬繃绋嬬殑浼樺寲闂鏃讹紝鎻愬嚭浜嗚憲鍚嶇殑鏈浼樺寲鍘熺悊锛屼粠鑰屽垱绔...
  • 鍔ㄦ佽鍒鐨勬ц川鏄粈涔堟剰鎬
    绛旓細锛1锛鍔ㄦ佽鍒鐨勬ц川鏄粈涔堟剰鎬濓紵鍔ㄦ佽鍒掞紙Dynamic Programming锛夋槸涓绉嶅父鐢ㄤ簬浼樺寲绠楁硶鐨勬柟娉曪紝瀹冪殑鏍稿績鎬濇兂鏄皢闂鍒掑垎鎴愯嫢骞蹭釜瀛愰棶棰橈紝閫氳繃淇濆瓨涓棿缁撴灉鏉ラ伩鍏嶉噸澶嶈绠楋紝浠庤屽疄鐜版椂闂村拰绌洪棿鐨勪紭鍖栥傚洜姝わ紝鍔ㄦ佽鍒掔殑鎬ц川灏辨槸鈥滄渶浼樺瓙缁撴瀯鎬ц川鈥濆拰鈥滃瓙闂閲嶅彔鎬ц川鈥濄傛渶浼樺瓙缁撴瀯鎬ц川鎸囩殑鏄滀竴涓棶棰樼殑...
  • 杩愮瀛︾敤鍔ㄦ佽鍒姹傝В涓嬪垪绾挎ц鍒掗棶棰
    绛旓細鍔ㄦ佽鍒(dynamic programming)鏄繍绛瑰鐨勪竴涓垎鏀紝鏄眰瑙e喅绛栬繃绋(decision process)鏈浼樺寲鐨勬暟瀛︽柟娉曘20涓栫邯50骞翠唬鍒濈編鍥芥暟瀛﹀R.E.Bellman绛変汉鍦ㄧ爺绌跺闃舵鍐崇瓥杩囩▼(multistep decision process)鐨勪紭鍖栭棶棰樻椂锛屾彁鍑轰簡钁楀悕鐨勬渶浼樺寲鍘熺悊(principle of optimality)锛屾妸澶氶樁娈佃繃绋嬭浆鍖栦负涓绯诲垪鍗曢樁娈甸棶棰橈紝鍒╃敤...
  • 浠涔堟槸鍔ㄦ佽鍒?鍔ㄦ佽鍒掔殑鎰忎箟鏄粈涔
    绛旓細鍔ㄦ佽鍒(dynamic programming)鏄繍绛瑰鐨勪竴涓垎鏀紝鏄眰瑙e喅绛栬繃绋(decision process)鏈浼樺寲鐨勬暟瀛︽柟娉曘20涓栫邯50骞翠唬鍒濈編鍥芥暟瀛﹀R.E.Bellman绛変汉鍦ㄧ爺绌跺闃舵鍐崇瓥杩囩▼(multistep decision process)鐨勪紭鍖栭棶棰樻椂锛屾彁鍑轰簡钁楀悕鐨勬渶浼樺寲鍘熺悊(principle of optimality)锛屾妸澶氶樁娈佃繃绋嬭浆鍖栦负涓绯诲垪鍗曢樁娈甸棶棰橈紝鍒╃敤...
  • 鍔ㄦ佽鍒绠楁硶鐨勫熀鏈濇兂
    绛旓細鍔ㄦ佽鍒绠楁硶涓庡垎娌绘硶绫讳技锛屽叾鍩烘湰鎬濇兂涔熸槸灏嗗緟姹傝В闂鍒嗚В鎴愯嫢骞蹭釜瀛愰棶棰樸備絾鏄粡鍒嗚В寰楀埌鐨勫瓙闂寰寰涓嶆槸浜掔浉鐙珛鐨勩備笉鍚屽瓙闂鐨勬暟鐩父甯稿彧鏈夊椤瑰紡閲忕骇銆傚湪鐢ㄥ垎娌绘硶姹傝В鏃讹紝鏈変簺瀛愰棶棰樿閲嶅璁$畻浜嗚澶氭銆傚鏋滆兘澶熶繚瀛樺凡瑙e喅鐨勫瓙闂鐨勭瓟妗堬紝鑰屽湪闇瑕佹椂鍐嶆壘鍑哄凡姹傚緱鐨勭瓟妗堬紝灏卞彲浠ラ伩鍏嶅ぇ閲忛噸澶嶈绠...
  • 鍔ㄦ佽鍒娉曞浣曠敤浜庢眰瑙f渶鐭矾寰勯棶棰?
    绛旓細鍔ㄦ佽鍒娉曟槸涓绉嶇敤浜庢眰瑙f渶鐭矾寰勯棶棰樼殑鏈夋晥鏂规硶銆傚畠閫氳繃灏嗛棶棰樺垎瑙d负瀛愰棶棰橈紝骞跺埄鐢ㄥ瓙闂鐨勮В鏉ユ瀯寤哄師闂鐨勮В锛屼粠鑰岄伩鍏嶄簡閲嶅璁$畻銆傚湪姹傝В鏈鐭矾寰勯棶棰樻椂锛屾垜浠彲浠ヤ娇鐢ㄥ姩鎬佽鍒掓硶鏉ュ鎵句粠涓涓捣鐐瑰埌缁堢偣鐨勬渶鐭矾寰勩傞鍏堬紝鎴戜滑闇瑕佸畾涔変竴涓姸鎬佽浆绉绘柟绋嬶紝璇ユ柟绋嬫弿杩颁簡濡備綍浠庡綋鍓嶇姸鎬佽浆绉诲埌涓嬩竴涓姸鎬...
  • 涓轰粈涔堣鎶鏈粡娴庡垎鏋愭槸涓涓鍔ㄦ佽鍒杩囩▼?
    绛旓細璇ユ儏鍐靛師鍥犲涓嬶細鍔ㄦ佽鍒鏄竴绉嶈В鍐冲闃舵鍐崇瓥闂鐨勬柟娉曪紝鍏舵牳蹇冩濇兂鏄皢澶嶆潅闂鍒嗚В涓轰竴绯诲垪绠鍗曢棶棰橈紝鐒跺悗瀵硅繖浜涚畝鍗曢棶棰樿繘琛屾眰瑙o紝骞跺皢杩欎簺绠鍗曢棶棰樼殑瑙g粍鍚堣捣鏉ュ緱鍒板師闂鐨勮В銆傚湪鍔ㄦ佽鍒掔殑杩囩▼涓紝姣忎竴闃舵鐨勫喅绛栭兘渚濊禆浜庡綋鍓嶇姸鎬侊紝鍙堥殢鍗冲紩璧风姸鎬佺殑杞Щ锛屼竴涓喅绛栧簭鍒楀氨鏄湪鍙樺寲鐨勭姸鎬佷腑浜х敓鍑烘潵鐨...
  • 扩展阅读:最终幻想蒂法酒吧视频 ... 动态规划python ... 动态规划经典题目 ... 动态规划基本概念 ... dijkstra算法详细步骤 ... 动态规划的基本思想 ... 动态规划经典100题 ... 01背包问题动态规划 ... 动态规划的四个步骤 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网