算法第3章作业
- 对动态规划算法的理解:
动态规划算法与分治法有点类似,主要思想是把待求解的问题分解成若干个子问题,通过先求解子问题再从子问题的解得出原问题的解。动态规划算法更加适合用来求最优解问题,有时候需要用一个表来记录已解决的子问题的答案,用来避免多次计算子问题的结果。
2.编程题1的递归方程如下:
for(int i=0;i<n;i++){
cin>>a[i];
b[i]=a[i];
}
int k,t;
for(int i=0;i<n-1;++i){
k=i;
for(int j=i+1;j<=n-1;++j){
if(a[j]<a[k])k=j;
}
if(k!=i){
t=a[i];a[i]=a[k];a[k]=t;
}
}
for(int i=0;i<n;i++){
c[i]=a[i];
}
int i,j;
int x[n][n],y[n][n];
for(i=1;i<=n;i++){
x[i][0]=0;
x[0][i]=0;
}
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
if(c[i]==b[j]){
x[i][j]=x[i-1][j-1]+1;
y[i][j]=1;
}
else if (x[i-1][j]>=x[i][j-1]){
x[i][j]=x[i-1][j];
y[i][j]=2;
}
else {
x[i][j]=x[i][j-1];
y[i][j]=3;
}
}
}
编程题2的递归方程如下:
for(int i=0; i<n-1; i++){
for(int j=i+1; j<n; j++){
cin>>fee[i][j];
}
}
for(int k=2; k<n; k++)
for(int i=0; i<n-k; i++){
int j = i+k;
for(int a =i+1; a<j; a++){
int b = fee[i][a] + fee[a][j];
if(fee[i][j] > b)
fee[i][j] = b;
}
}
cout<<fee[0][n-1]<<endl;
return 0;
}
3.结对编程的情况:
结对编程时双方对问题有不同的看法,经过一番商量和分析后,都认识到了自己的思想的不足之处,并对算法做出了相应修改。