题解 SP346

题解 SP346

这个题的翻译貌似有点问题,这里的 coinsgold 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;
}
posted @ 2022-11-30 09:17  Tyrue  阅读(11)  评论(0编辑  收藏  举报