如果是奇数,可以从前面,或者一半或者一半加1处转移
如果是偶数,可以从前面或者一半处转移
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=1e7+1; ll f[N]; int main(){ int n,x,y; cin>>n>>x>>y; int i,j; f[1]=x; for(i=2;i<=n;i++){ if(i%2){ f[i]=min(f[i-1]+x,min(f[i/2]+x+y,f[i/2+1]+x+y)); } else{ f[i]=min(f[i-1]+x,f[i/2]+y); } } cout<<f[n]<<endl; }View Code