1、实例计算(写出计算过程):

    1)对维数为序列<5, 10, 3, 12, 5, 50, 6>的各矩阵,找出其矩阵链乘积的一个最优加全部括号。

    这是一个矩阵连乘问题,基本知识可以参考:

    就本题分析如下:

用递推公式

m[i][j]表示为:

i=j时,m[i][j]填0;i>j时,m[i][j]为空;i>j时,求min。

后一级基于前一级dp出的最优解(每一级即与对角线平行的线)

i\j     1      2      3      4      5        6

1      0

2              0

3                     0

4                             0

5                                     0

6                                              0

----------------------------------------------

i=1,j=2:m[1][2]=min{0+0+5×10×3}=150;

i=2,j=3:m[2][3]=min{0+0+10×3×12}=360;

i=3,j=4:m[3][4]=min{0+0+3×12×5}=180;

i=4,j=5:m[4][5]=min{0+0+12×5×50}=3000;

i=5,j=6:m[5][6]=min{0+0+5×50×6}=1500;

i\j     1        2       3        4        5         6

1      0     150

2              0     360

3                        0      180

4                                   0   3000

5                                           0     1500

6                                                      0

------------------------------------------------

i=1,j=3:

m[1][3]

=min{m[1][1]+m[2][3]+p0p1p3,m[1][2]+m[3][3]+p0p2p3} //m[2][3]和m[1][2]就用前一级的360和150

=min{0+360+5×10×12,150+0+5×3×12}

=330;

i=2,j=4:

m[2][4]

=min{m[2][2]+m[3][4]+p1p2p4,m[2][3]+m[4][4]+p1p3p4} //m[3][4]和m[2][3]就用前一级的180和360

=min{0+180+10×3×5,360+0+10×12×5}

=330;

i=3,j=5:

m[3][5]

=min{m[3][3]+m[4][5]+p2p3p5,m[3][4]+m[5][5]+p2p4p5}//m[4][5]和m[3][4]就用前一级的3000和180

=min{0+3000+3×12×5,180+0+3×5×50}

=930;

i=4,j=6:

m[4][6]

=min{m[4][4]+m[5][6]+p3p4p6,m[4][5]+m[6][6]+p3p5p6}//m[5][6]和m[4][5]就用前一级的1500和3000

=min{0+1500+12×5×6,3000+0+12×50×6}

=1860;

i\j     1      2         3          4        5         6

1      0     150    330

2              0       360     330

3                         0       180   930

4                                     0    3000   1860

5                                              0      1500

6                                                          0

----------------------------------------------------------

i=1,j=4:

m[1][4]

=min{m[1][1]+m[2][4]+p0p1p4,m[1][2]+m[3][4]+p0p2p4,m[1][3]+m[4][4]+p0p3p4}

=min{0+330+5×10×5,150+180+5×3×5,330+0+5×12×5}

=min{580,405,630}

=405

i=2,j=5:

m[2][5]

=min{m[2][2]+m[3][5]+p1p2p5,m[2][3]+m[4][5]+p1p3p5,m[2][4]+m[5][5]+p1p4p5}

=min{0+930+10×3×50,360+3000+10×12×50,330+0+10×5×50}

=min{2430,9360,2830}

=2430

i=3,j=6:

m[3][6]

=min{m[3][3]+m[4][6]+p2p3p6,m[3][4]+m[5][6]+p2p4p6,m[3][5]+m[6][6]+p2p5p6}

=min{0+1860+3×12×6,180+1500+3×5×6,930+0+3×50×6

=min{2076,1770,1830}

=1770

i\j     1      2        3         4          5           6

1      0     150    330    405

2              0       360    330     2430

3                         0      180      930    1770

4                                  0        3000   1860

5                                               0      1500

6                                                          0

----------------------------------------------------------

i=1,j=5:

m[1][5]

=min{m[1][1]+m[2][5]+p0p1p5,m[1][2]+m[3][5]+p0p2p5,

m[1][3]+m[4][5]+p0p3p5,m[1][4]+m[5][5]+p0p4p5}

=min{0+2430+5×10×50,150+930+5×3×50,330+3000+5×12×50,405+0+5×5×50}

=min{4930,1830,6330,1655}

=1655

i=2,j=6:

m[2][6]

=min{m[2][2]+m[3][6]+p1p2p6,m[2][3]+m[4][6]+p1p3p6,

m[2][4]+m[5][6]+p1p4p6,m[2][5]+m[6][6]+p1p5p6}

=min{0+1770+10×3×6,360+3000+10×12×6,330+1500+10×5×6,2430+0+10×50×6}

=min{,4080,2130,5430}

=1950

i\j     1      2      3        4        5        6

1      0    150  330    405   1655

2              0    360    330    2430   1950

3                      0      180      930   1770

4                                0       3000   1860

5                                             0     1500

6                                                         0

----------------------------------------------------------

终于到最后了,只要求出m[1][6]就可以了!

m[1][6]

=min{m[1][1]+m[2][6]+p0p1p6,m[1][2]+m[3][6]+p0p2p6,

m[1][3]+m[4][6]+p0p3p6,m[1][4]+m[5][6]+p0p4p6,m[1][5]+m[6][6]+p0p5p6}

=min{0+1950+5×10×6,150+1770+5×3×6,

330+1860+5×12×6,405+1500+5×5×6,1655+0+5×50×6}

=min{2250,2010,2550,2055,3155}

=2010

所以矩阵连乘的最小值m[1][6]=2010

此时,

m[1][6]=m[1][2]+m[3][6]+p0p2p6

m[3][6]= m[3][4]+m[5][6]+p2p4p6

画的括号为:(A1A2)  (  (A3A4) (A5A6)  )

  核心代码:

void matrixChain(int p[],int m[][],int s[][])
//p用来记录矩阵,m[i][j]表示第i个矩阵到第j个矩阵的最优解,s[][]记录从哪里断开可以得到最优解
{
int n=len-;
for(int i=; i<=n; i++)//初始化数组
m[i][j]=;
for(int r=; r<=n; r++)//对角线循环
{
for(int i=; i<=n-r+; i++) //行循环
{
int j=i+r-;//列的控制
m[i][j]=m[i+][j]+p[i-]*p[i]*p[j];//找m[i][j]的最小值,初始化使k=i;
s[i][j]=i;
for(int k=i+; k<j; k++)
{
int t=m[i][k]+m[k+][j]+p[i-]*p[k]*p[j];
if(t<m[i][j])
{
s[i][j]=k;//在k位置断开得到最优解
m[i][j]=t;
}
}
}
}
}

    2)确定<1, 0, 0, 1, 0, 1, 0, 1>和<0, 1, 0, 1, 1, 0, 1, 1, 0>的一个最长公共子序列LCS。

    板子题,直接套之前写的那篇:https://www.cnblogs.com/fangxiaoqi/p/10915451.html

#include<bits/stdc++.h>
#define MAX 5005
using namespace std;
int f[MAX][MAX];
string s,t;
int main(){
while(cin>>s>>t){
for(int i=;i<=s.length();i++)
for(int j=;j<=t.length();j++){
f[i][j]=max(f[i-][j],f[i][j-]);
if(s[i-]==t[j-])
f[i][j]=max(f[i][j],f[i-][j-]+);
}
cout<<f[s.length()][t.length()]<<endl;
}
return ;
}

  2、算法设计

    1)问题:有n个物品,第i个物品价值为vi,重量为wi,其中vi和wi均为非负数,背包的容量为W,W为非负数。现需要考虑如何选择装入背包的物品,使装入背包的物品总价值最大。

用dp解背包

假定一组数据:

vi  4  5  10  11  13

wi  3  4  7   8   9

①    分析最优解的结构

  如果背包最优解中有物品n,xn=1,那么x1----x(n-1)就是这n-1个子问题在容量W-wn时的最优解。如果背包最优解中无n,xn=0,那么x1-----x(n-1)一定构成这n-1个子问题在W时的最优解。

②    建立递归关系

  设m[i,w]为背包容量w时i个物品导致的最优解的总价值,根据递归关系导出状态转移方程:

  If i>0&&wi<=w

    m[I,w]=max{m[i-1,w-wi]+vi,m[i-1,w]}

  else

    m[I,w]=m[i-1,w]

③    计算最优值

  最优值就是m[i,w],对应的放置内容从后向前逐级递归。

    2)一个序列有N个数:A[1],A[2],…,A[N],求出最长上升子序列的长度(LIS:longest increasing subsequence)。例如,对于序列(1, 7, 3, 5, 9, 4, 8),有它的一些上升子序列,如(1, 7), (3, 5, 9) , (3, 4, 8)等等。这些子序列中最长的长度是4,比如子序列(1, 3, 5, 9) ,(1, 3, 5, 8)和(1, 3, 4, 8).

    最大递增子序列,直接套之前写的代码:https://www.cnblogs.com/fangxiaoqi/p/10915452.html

#include<bits/stdc++.h>
using namespace std;
int sum[],a[];
int main(){
int i,n,mmax=,maxa=;
while(cin>>n && n){
memset(a,,sizeof(a));
for(i=; i<=n; i++){
cin>>a[i];
}
for(i=; i<=n; i++){
mmax = ;
for(int j=; j<i; j++)
if(a[j] < a[i])
mmax = max(sum[j],mmax);
sum[i] = mmax + a[i];
maxa = max(maxa,sum[i]);
}
cout<<maxa<<endl;
maxa = ;
}
return ;
}

    3)问题描述 :设有一个长度N的数字串,要求选手使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1个部分的乘积能够为最大。

       例子:有一个数字串: 312,当N=3,K=1时会有以下两种分法:

         1)3*12=36

         2)31*2=62

       这时,符合题目要求的结果是: 31*2=62

      现在,请你设计一个程序,求得正确的答案。

分析:

这个问题有dp的最优子结构,以插入的乘号数来划分阶段,若插入K个乘号,问题是一种K个阶段的决策问题,记m[i][k]表示在前i位数中插入K个乘号所得的max,用来保存每个阶段的状态,a{j}[i]表示从j位到第i位组成的数字。

得到状态转移方程:

m[i][k] = max{m[j][k-1]*a[j+1][i]}    (k<=j<=i)

&& m[j][0] = a[1][j]    (1<j<=i)

代码:

#include<bits/stdc++.h>
using namespace std;
int main(){
int K,N,i,j,k;
char s[];
int dp[][];
int num[][];
cin >> N >> K >> s;
memset(dp,,sizeof(dp));
for(i=;i<N;i++){
int temp = ;
for(j=i;j<N;j++){
temp = temp* + s[j] - '';
num[i][j] = temp;
}
}
for(i=;i<N;i++)
dp[i][] = num[][i];
for(i=;i<N;i++)
for(j=;j<=K;j++)
for(k=;k<i;k++)
dp[i][j] = max(dp[k][j-]*num[k+][i],dp[i][j]);
cout << dp[N-][K] << endl;
return ;
}

dp[2019.5.25]的更多相关文章

  1. dp[2019.5.25]_2

    1.对于长度相同的2个字符串A和B,其距离定义为相应位置字符距离之和.2个非空格字符的距离是它们的ASCII码之差的绝对值.空格与空格的距离为0,空格与其他字符的距离为一定值k. 在一般情况下,字符串 ...

  2. [2019.03.25]Linux中的查找

    TMUX天下第一 全世界所有用CLI Linux的人都应该用TMUX,我爱它! ======================== 以下是正文 ======================== Linu ...

  3. Alpha冲刺(2/10)——2019.4.25

    所属课程 软件工程1916|W(福州大学) 作业要求 Alpha冲刺(2/10)--2019.4.25 团队名称 待就业六人组 1.团队信息 团队名称:待就业六人组 团队描述:同舟共济扬帆起,乘风破浪 ...

  4. Beta冲刺(4/7)——2019.5.25

    所属课程 软件工程1916|W(福州大学) 作业要求 Beta冲刺(4/7)--2019.5.25 团队名称 待就业六人组 1.团队信息 团队名称:待就业六人组 团队描述:同舟共济扬帆起,乘风破浪万里 ...

  5. [MP3]MP3固件持续分享(2019.1.25)

    转载自我的博客:https://blog.ljyngup.com/archives/179.html/ 所有的固件到我的博客就可以下载哦 最后更新于2019.2.1 前言 这篇文章会持续更新不同型号的 ...

  6. 2019.03.25 bzoj4572: [Scoi2016]围棋(轮廓线dp)

    传送门 题解可以参见zjjzjjzjj神仙的,写的很清楚. 代码: #include<bits/stdc++.h> #define ri register int using namesp ...

  7. IntelliJ IDEA 2018.3.3配置 Tomcat 9,控制台出现中文乱码 “淇℃伅”(2019/01/25)

    (win10系统) 全新idea配置全新版本Tomcat突遇 “淇℃伅”,网上大部分解决方案均已失效 似乎是idea与Tomcat命令行输出格式不一致所致,千辛万苦在某一小角落发现这个方法,一针见血, ...

  8. 纪中OJ 2019.01.25【NOIP提高组】模拟 B 组 T2 数字对

    声明 数字对 Time Limits: 2000 ms    Memory Limits: 262144 KB Description 小 H 是个善于思考的学生,现在她又在思考一个有关序列的问题.  ...

  9. 2019.3.25 SQL语句(进阶篇1)

    运算符 基本的加减乘除取余都可以在SQL中使用 新建Employee1表并添加数据 create table Employee1 (eid int primary key auto_increment ...

随机推荐

  1. 你的VCL界面开发不知所措?这款工具绝对超出预料

    DevExpress VCL Controls是 Devexpress公司旗下最老牌的用户界面套包.所包含的控件有:数据录入,图表,数据分析,导航,布局,网格,日程管理,样式,打印和工作流等,让您快速 ...

  2. [Google Guava] 2.4-集合扩展工具类

    原文链接 译文链接 译者:沈义扬,校对:丁一 简介 有时候你需要实现自己的集合扩展.也许你想要在元素被添加到列表时增加特定的行为,或者你想实现一个Iterable,其底层实际上是遍历数据库查询的结果集 ...

  3. MySQL5.7.6 general tablespace

    摘要: 从5.7.6开始,增加了一种新的 tablespace模式(成为general tablespace),实际上它和共享表空间比较类似:创建一个单独的ibd,ibd中包含多个表,兼容不同的格式. ...

  4. vue-ckeditor-word粘贴

    我司需要做一个需求,就是使用富文本编辑器时,不要以上传附件的形式上传图片,而是以复制粘贴的形式上传图片. 在网上找了一下,有一个插件支持这个功能. WordPaster 安装方式如下: 直接使用Wor ...

  5. CF D. Ehab and the Expected XOR Problem 贪心+位运算

    题中只有两个条件:任意区间异或值不等于0或m. 如果只考虑区间异或值不等于 0,则任意两个前缀异或值不能相等. 而除了不能相等之外,还需保证不能出现任意两个前缀异或值不等于m. 即 $xor[i]$^ ...

  6. UVA 11754 Code Feat 中国剩余定理+枚举

    Code FeatUVA - 11754 题意:给出c个彼此互质的xi,对于每个xi,给出ki个yj,问前s个ans满足ans%xi的结果在yj中有出现过. 一看便是个中国剩余定理,但是同余方程组就有 ...

  7. 18.4.1 考试解题报告 P71

    题目:https://files.cnblogs.com/files/lovewhy/problem.pdf 偷偷摘来dalao题面. P71竞赛时间:???? 年?? 月?? 日??:??-??:? ...

  8. nodejs基础 用http模块 搭建一个简单的web服务器 响应纯文本

    首先说一下,我们平时在浏览器上访问网页,所看到的内容,其实是web服务器传过来的,比如我们访问www.baidu.com.当我们在浏览器地址栏输入之后,浏览器会发送请求到web服务器,然后web服务器 ...

  9. 页面的beforeunload和unload的事件应用

    博主最近遇到一个需求,需要在用户离开之前给一个提示,是否确认离开,并且用户确认离开的话,需要发出一个请求 下面直接上代码: <!DOCTYPE HTML> <html> < ...

  10. SpringMVC框架下Web项目的搭建与部署

    这篇文章已被废弃. 现在,Deolin使用Maven构建项目,而不是下载Jar文件,使用Jetty插件调试项目,而不是外部启动Tomcat. SpringMVC比起Servlet/JSP方便了太多 W ...