第三章作业

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

动态规划:多阶段(两段)最优化决策解决问题的过程就称为动态规划。

总的来说动态规划算法思想是问题的规模缩小,然后求解子问题,根据子问题来解决总问题。动态规划问题将中间结果保留在数组中,每个状态都对应一个状态转移。动态规划考虑问题是从全局来考虑,每个结果的计算都考虑了当前的最优解,然后逐步扩大,求出全局的最优解,而这个最优解是全局最优解。这跟分治法的思想很类似。

 

2. 分别列出编程题1、2的递归方程

7-1 单调递增最长子序列 (20 分)

设计一个O(n2)时间的算法,找出由n个数组成的序列的最长单调递增子序列。

 

#include <stdio.h>

#define MAX_N 1000

int dp[MAX_N], a[MAX_N];
int n;

void input()
{
scanf("%d", &n);
for(int i = 0; i < n; ++i)
scanf("%d", &a[i]);
}

int max_(int a, int b)
{
return a > b ? a : b;
}

void slove()
{
int res = 0;
for(int i = 0; i < n; ++i)
{

for(int j = 0; j < i; ++j)
if(a[j] < a[i])
dp[i] = max_(dp[i], dp[j] + 1);

res = max_(dp[i], res);
}
printf("%d\n", res + 1);

}

int main()
{
input();
slove();
return 0;
}

 

7-2 租用游艇问题 (17 分)

题目来源:王晓东,《算法设计与分析》

长江游艇俱乐部在长江上设置了n个游艇出租站1,2,…,n。游客可在这些游艇出租站租用游艇,并在下游的任何一个游艇出租站归还游艇。游艇出租站i到游艇出租站j之间的租金为r(i,j),1<=i<j<=n。试设计一个算法,计算出从游艇出租站1 到游艇出租站n所需的最少租金。

 

#include <iostream>

using namespace std;

int main()

{

int n;

cin>>n;

int a[100][100];

for(int i=0;i<n-1;i++)

for(int j=i+1;j<n;j++)

{

cin>>a[i][j];

}

for(int i=2;i<n;i++)

for(int j=0;j<n-i;j++)

{

int k=i+j;

for(int x=j+1;x<k;x++)

{

int b=a[j][x]+a[x][k];

if(a[j][k]>b)

a[j][k]=b;

}

}

cout<<a[0][n-1];

return 0;

 }

 

 

3. 结对编程情况

和队友分享交流了代码之后,交流了各自的思想,代码上感觉大同小异。

posted @ 2018-10-28 18:48  Archer丶kk  阅读(189)  评论(0编辑  收藏  举报