动态规划实现最佳加法表达式求最小值.doc_第1页
动态规划实现最佳加法表达式求最小值.doc_第2页
动态规划实现最佳加法表达式求最小值.doc_第3页
动态规划实现最佳加法表达式求最小值.doc_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验习题:最佳加法表达式C语言实现有一个由1.9组成的数字串,问如果将m个加号插入到这个数字串中,使得所形成的算术表达式的值最小添加加号后,表达式的最后一定是个数字串,我们发现:把以前状态认为是在前i个字符中插入m-1个加号(i当作决策在枚举),然后i+1到最后一位一定是整个没被分割的数字串,第m个加号就添加在i与i+1个数字之间。即构造出了整个数字串的最优解。至于前i个字符中插入m-1个加号,这又回到原问题的形式,回到以前状态,那么状态转移方程可构造。例:数字串79846,若需要加入两个加号,则最佳方案为79+8+46,算术表达式的值为133。算法实现分析:用fij,表示在前i个字符中插入j个加号能达到的最小值,那么最后的答案也即flength(s)m。于是,有DP方程:fij=min(fij,fkj-1+numk+1:i),numk+1:i 表示k+1位到i位所形成的数字,这是把加号插入第k+1个位置上。以下是给定整数串和加号个数的C语言程序:#include#include #define max 100#define INF 100000 void DP(int *a, int t, int m)int i,j,d,k,min;int fmt;int nummm; for(i=0;im;i+) /给二维数组num赋值,num表示整数串第i到j位 for(j=0,d=0;j j) numij=INF; else d=d*10 + aj; numij = d; for(i = 1; i= m; i+) for(j = 0; j =i) fij=INF; else if(j=0) fij=num0i-1; else for(min=INF,k=1;kfij)min=fij; fij=min; printf(最小值为:%d,fmt); int main()int m;int arrmax =7, 9, 8, 5, 3;int time=2;m = 5;DP(arr,time,m); 以下是可以自己输入整数串和加号个数的C语言程序:#include#include #define max 100#define INF 100000 void DP(char *a, int t, int m)int i,j,d,k,min;int fm+1t+1; int nummm; for(i=0;im;i+) /给二维数组num赋值,num表示整数串第i到j位 for(j=0,d=0;j j) numij=INF; else d=d*10 + (int)(aj-0); numij = d; for(i = 1; i= m; i+) for(j = 0; j =i) fij=INF; else if(j=0) fij=num0i-1; else for(min=INF,k=1;kfij)min=fij; fij=min; printf(最小值为:%d,fmt); int main()int m;int time;/int arrmax =7, 9, 8, 5, 3;char arrmax;printf(请输入整数串:);scanf(%s,&a

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论