题解 SP346
题解 SP346
这个题的翻译貌似有点问题,这里的 coins
和 gold coins
其实是一个东西
有了这个前提,我们是再去看题面,就可以发现,这里的 coins
可以同时换成
$\dfrac{n}{2}\ \dfrac{n}{3} \ $ 以及 \(\dfrac{n}{4}\) 的美金,或者 \(1:1\) 直接兑换美金
所以我们就有了以下的策略
\(m[ i ]=Max(m[\lfloor \dfrac{i}{2} \rfloor]+m[\lfloor \dfrac{i}{3} \rfloor]+m[\lfloor \dfrac{i}{4} \rfloor],i)\)
这里我们会发现有很多种状态会重复,并且这里大于 n
的都不会搜到的,所以我们直接用 map
存一下,因为是下标并不连续,所以可以实现动态的效果
#include<cstdio>
#include<map>
#include<iostream>
using namespace std;
int T,n;
map<int,int> m;
int Max(int x,int y){
return x>y?x:y;
}
int dfs(int x){
if(x==0){
return 0;
}
if(!m[x]){
return m[x]=Max(dfs(x/2)+dfs(x/3)+dfs(x/4),x);
}
return m[x];
}
int main(){
while(scanf("%d",&n)!=EOF){
m.clear();
printf("%d\n",dfs(n));
}
return 0;
}