算法第3章作业

一、对动态规划算法的理解

动态规划,我的理解就是当前状态的最优解必定来自来自过去状态的最优解,所以需要把问题不断的往回退,不断的把过去的状态的最优解求出,最后动态的选择出最优解,所以称作是动态规划。

二、编程题1、2的递归方程

编程题1的递归方程:

  for(int i = 1; i <= n; i++){
    for(int j = 0; j <= i; j++){
      if(num[i]>num[j])
        dp[i] = dp[i]>dp[j]+1?dp[i]:dp[j]+1;
    }
    max = max>dp[i]?max:dp[i];
  }

 

具体代码:

#include <iostream>
using namespace std;
int n;
int num[1005];
int dp[1005];
int main(){
  cin >> n;
  num[0] = -1e9; 
  for(int i = 1; i <= n ; i++){
    cin >> num[i];
  }
  int max = 0;
  for(int i = 1; i <= n; i++){
    for(int j = 0; j <= i; j++){
      if(num[i]>num[j])
        dp[i] = dp[i]>dp[j]+1?dp[i]:dp[j]+1;
    }
    max = max>dp[i]?max:dp[i];
  }
  cout << max << endl;
  return 0;
}

 

编程题2的递归方程:

    for(int i = 1; i < n; i++){
        for(int j = i+1; j <= n; j++){
            cin >> f[j];
            if(i==1)
                dp[j] = f[j];
            else
                dp[j] = dp[j]<f[j]+dp[i]?dp[j]:f[j]+dp[i];
        }
    } 

 

具体代码:

#include <iostream>
using namespace std;
int n;
int f[205];
int dp[205];
int main(){
    cin >> n;
    for(int i = 1; i < n; i++){
        for(int j = i+1; j <= n; j++){
            cin >> f[j];
            if(i==1)
                dp[j] = f[j];
            else
                dp[j] = dp[j]<f[j]+dp[i]?dp[j]:f[j]+dp[i];
        }
    } 
    cout << dp[n] << endl;
    return 0;
}

三、结对编程情况

由于本次的作业上周就提前完成了,完成作业的时候并没有过多的与队友交流。

后来与队友互换代码学习的时候,发现代码思路是一样的,另外还了解到有同学使用记忆花搜索完成的作业,也学习了一下。

 

posted @ 2018-10-24 21:30  请你吃糖呀  阅读(186)  评论(2编辑  收藏  举报