算法第3章作业

对动态规划的理解(递归解法)

  • 确定递归出口
  • 直接返回已计算过的子问题的解
  • 对于没计算过的问题,用其子问题的解将其算出

7-1

其中\(dp[i]\)表示前i个数字在包含\(a[i]\)情况下的最长上升子序列的长度

int solve(int k)
{
    if (dp[k])
        return dp[k];
    for (int i=1;i<k;++i)
        if (a[i] < a[k] && dp[k] < solve(i) + 1)
            dp[k] = dp[i] + 1;
    return dp[k];
}

7-2

其中\(solve(i,j)\)表示从\(i\)\(j\)的最小花费

int solve(int i,int j)
{
    if (dp[i][j])
        return dp[i][j];
    if (j - i == 1)
        return dp[i][j] = price[i][j];

    int M = price[i][j];
    for (int k = i+1; k < j; ++k)
        M = min(M,solve(i,k) + solve(k,j));
    return dp[i][j] = M;
}

结对编程情况

  • 队友太强了,希望它能多带带我
posted @ 2018-10-28 21:30  Apale  阅读(188)  评论(1)    收藏  举报