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.结对编程情况:
最近我和小伙伴的结对编程比较少,只是通过线上的联系来保持,可能是因为最近活动比较多,因而比较少有空闲时间留用结对编程。在接下来的时间里,我们会抽出更多时间进行结对编程,也希望通过这种方式不断提高自身的编程能力,增进和搭档的友谊。
原文:https://www.cnblogs.com/yilun578663140/p/9940847.html