算法第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; }
三、结对编程情况
由于本次的作业上周就提前完成了,完成作业的时候并没有过多的与队友交流。
后来与队友互换代码学习的时候,发现代码思路是一样的,另外还了解到有同学使用记忆花搜索完成的作业,也学习了一下。