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. 结对编程情况
和队友分享交流了代码之后,交流了各自的思想,代码上感觉大同小异。