算法第3章作业

1.对动态规划算法的理解:

动态规划算法的基本思想同分治法类似,即将待求解的问题分解成若干个子问题,先求解子问题,然后从这些子问题的解中得到原问题的解。与分治法不同的是,这若干个子问题不是相互独立的,而是有交集的,如果用分治法的思想去解决的话,会因为重复操作而浪费时间,所以需要采用动态规划的思想。动态规划可分为四步:1.找出最优解的性质,刻画其结构特征;2.递归定义最优值;3.以自底向上的方式计算最优值;4.根据计算最优值得到的信息,构造最优解;

2.编程题:

一、单调递增最长子序列:

代码:

#include <iostream>
#include<algorithm>
using namespace std;
int m[1000][1000];
void Longest(int x[],int y[],int n)
{
for(int i=1;i<=n;i++) m[i][0]=0;
for(int i=1;i<=n;i++) m[0][i]=0;

for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(x[i]==y[j]) {
m[i][j]=m[i-1][j-1]+1;
}
else if(m[i-1][j]>=m[i][j-1]){
m[i][j]=m[i-1][j];
}
else {
m[i][j]=m[i][j-1];
}
}
}
int main()
{
int n;
cin>>n;
int a[n+1],b[n+1];
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++)
b[i]=a[i];
sort(a+1,a+n+1);
for(int i=1;i<=n;i++)
Longest(a,b,n);
cout<<m[n][n]<<endl;

return 0;
}

递归方程:

                0   i=0,j=0;

m[i][j]=     m[i-1][j-1]+1  i,j>0;x[i]=y[i];

                max{m[i-1][j],m[i][j-1]}  i,j>0;x[i]不等于y[i]

二、租用游艇问题:

代码:

#include <iostream>
using namespace std;
int a[201][201];
int b[201][201];
void Rent(int i,int j,int n)
{
int u=2;
for(int l=1;l<=n;l++) b[l][l]=0;
for(int k=1;k<n;k++)
{
for(int m=u;m<=n;m++)
b[k][m]=a[k][m];
u++;
}
u=3;
for(int k=1;k<n-1;k++)
{
for(int m=u;m<=n;m++)
for(int o=k+1;o<=m-1;o++)
{
int t=b[k][o]+b[o][m];
if(t<b[k][m]) b[k][m]=t;
}
u++;
}
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n-1;i++)
for(int j=i+1;j<=n;j++)
{
cin>>a[i][j];
}
Rent(1,n,n);
cout<<b[1][n]<<endl;
return 0;
}

递归方程:

                 0      i=j

b[i][j]=

             min{b[i][k]+b[k][j]}    i<j (i<k<j)

3.结对编程情况:

最近我和小伙伴的结对编程比较少,只是通过线上的联系来保持,可能是因为最近活动比较多,因而比较少有空闲时间留用结对编程。在接下来的时间里,我们会抽出更多时间进行结对编程,也希望通过这种方式不断提高自身的编程能力,增进和搭档的友谊。

posted @ 2018-11-10 22:15  578663140  阅读(106)  评论(0编辑  收藏  举报