- 你对动态规划算法的理解
动态规划的思想是把待求解的问题分解成若干个子问题,先求解子问题,然后从子问题的解得到原问题的解。动态规划经分解得到的子问题往往不是互相独立的。动态规划每次求解的值会被记录下来,不用 重复计算同一个值,提高了算法的效率。
- 分别列出编程题1、2的递归方程
//单调递增最长子序列 #include <iostream> using namespace std; int a[1000],h[1000]; int main(){ int n; cin>>n; for(int i=0;i<n;i++){ cin>>a[i]; } int tot=0; h[tot++]=a[0]; for(int i=1;i<n;i++){ for(int j=0;j<tot;j++){ if(h[j]>a[i]){ h[j]=a[i];break; } } if(a[i]>h[tot-1]){ h[tot++]=a[i]; } } cout<<tot<<endl; return 0; }
//租用游艇问题 #include <iostream> #include <cstdio> #include <stdlib.h> #include <string.h> #include <cstring> #include <vector> #include <algorithm> #include <math.h> using namespace std; const int N =1e4+9; int mp[209][209]; int dis[209]; int main(){ memset(dis,0x3f,sizeof(dis)); int n;cin>>n; for(int i=1;i<n;i++){ for(int j=i+1;j<=n;j++){ cin>>mp[i][j]; } } dis[1]=0; for(int i=2;i<=n;i++){ for(int j=1;j<i;j++){ if(dis[j]+mp[j][i]<dis[i]){ dis[i]=dis[j]+mp[j][i]; } } } cout<<dis[n]<<endl; return 0; }
- 结队编程情况:经过讨论后弄懂的代码,感觉有一定的提升。