算法第3章作业
1、对动态规划的理解
动态规划即是用一个表来记录所有已解决的子问题的答案,不管该子问题以后是否被用到,只要被计算过,就可将其结果填入表中。且动态规划算法适用于解最优化问题。通常可按以下4个步骤设计:
(1)找出最优解的性质,并刻画其结构特征
(2)递归地定义最优值
(3)以自底向上的方式计算出最优值
(4)根据计算最优值时得到的信息,构造最优解
2、分别列出编程题1、2的递归方程
编程题1:
长江游艇俱乐部在长江上设置了n个游艇出租站1,2,…,n。游客可在这些游艇出租站租用游艇,并在下游的任何一个游艇出租站归还游艇。游艇出租站i到游艇出租站j之间的租金为r(i,j),1<=i<j<=n。试设计一个算法,计算出从游艇出租站1 到游艇出租站n所需的最少租金。
输入格式:
第1 行中有1 个正整数n(n<=200),表示有n个游艇出租站。接下来的第1到第n-1 行,第i行表示第i站到第i+1站,第i+2站, ... , 第n站的租金。
输出格式:
输出从游艇出租站1 到游艇出租站n所需的最少租金。
代码如下:
#include<iostream> using namespace std; int main() { int num,i,j; int a[100],count[100]; cin>> num; for(int i=0;i<num;i++) count[i] = 1; for(int i=0;i<num;i++) cin>>a[i]; for(j=0;j<num;j++) { int k=j+1; for(int i=j;i<num-1;) { if(a[i]<a[k]) { count[j]++; i=k; k++; } else { k++; } } } int max = count[0]; for(int i=1;i<num;i++) if(max<count[i]) max = count[i]; cout<<max<<endl; return 0; }
编程题2:
长江游艇俱乐部在长江上设置了n个游艇出租站1,2,…,n。游客可在这些游艇出租站租用游艇,并在下游的任何一个游艇出租站归还游艇。游艇出租站i到游艇出租站j之间的租金为r(i,j),1<=i<j<=n。试设计一个算法,计算出从游艇出租站1 到游艇出租站n所需的最少租金。
输入格式:
第1 行中有1 个正整数n(n<=200),表示有n个游艇出租站。接下来的第1到第n-1 行,第i行表示第i站到第i+1站,第i+2站, ... , 第n站的租金。
输出格式:
输出从游艇出租站1 到游艇出租站n所需的最少租金。
代码如下:
#include <iostream> using namespace std; int main() { int n,i,j,k,p; int a[100][100]; cin>>n; for(i=1;i<=n;i++) { a[i][i]=0; } for(i=1;i<=n;i++) { for(j=i+1;j<=n;j++) { cin>>a[i][j]; } } for(i=2;i<=n;i++) { for(j=i+1;j<=n;j++) { k=j-i; for(p=k;p<j;p++) { if(a[k][j]>a[k][p]+a[p][j]) a[k][j]=a[k][p]+a[p][j]; } } } cout<<a[1][n]<<endl; return 0; }
3、结对编程情况
结对编程在上机的时候实践比较多,动态规划这部分虽然有点难,但是很实用,希望自己跟同伴都能继续认真学习,努力进步。