数的最少步骤转化为1
如果n为偶数,则将它除以2,
如果n为奇数,则将它加1或者减1。
问对于一个给定的n,怎样才能用最少的步骤将它变到1。
分析
考虑动态规划
若n为偶数, f(n)=f(n/2) + 1;
若n为奇数, f(n)= min(f(n-1), f(n+1)) +1 = min(f((n-1)/2), f((n+1)/2)) +2
code
#include <iostream>
#include <vector>
using namespace std;
int main(){
int n;
cin >> n;
vector<int> f(n + 1);
for (int i = 2; i <= n; i ++ )
if (i % 2 == 0) f[i] = f[i / 2] + 1;
else f[i] = min(f[(i - 1)/ 2], f[(i + 1)/2]) + 2;
cout << f[n] << endl;
return 0;
}
最近公共祖先
给定vector数组, 下标从0开始的树, 求最近公共祖先的值
OJ地址
int LCA(vector<int>&tree, int v1, int v2){
...
///
}
分析
不会, 等待补充