2.基础算法
1003-可爱の星空_2021秋季算法入门班第七章习题:动态规划1 (nowcoder.com)
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=100010,mod=1e9+7;
int f[N];
map<int,int>S;
void init()
{//代价指一个联通块的星星的数量减去另一个联通块内星星的数量,代价最小就让两个联通块内星星相等或接近
for(int i=2;i<N;i++)
{//要是代价最小,必须不断对半分,把前面的代价累加,算出新的下标的代价
//f[i]为最小的代价
f[i]=f[i/2]+f[i-i/2]+(i-i/2*2);
}
}
int dfs(int u)
{
if(u<N)return f[u];
//count()返回值是当前容器中,所查找元素存在的个数(对于map来说,返回值为1或者0)。
if(S.count(u))return S[u];
return S[u]=dfs(u/2)+dfs(u-u/2)+u-u/2*2;
}
signed main()
{
int T;
cin>>T;
init();
while(T--)
{
int n;
cin>>n;