题解:AtCoder Beginner Contest 260 C-Changing Jewels
- 题目:
C - Changing Jewels (atcoder.jp)https://atcoder.jp/contests/abc260/tasks/abc260_c
- 思路:
由于n很小,做个简单的记忆化搜索就能过……
状态设计:用二元组(l(long long表示珠宝等级),col(bool表示珠宝类型)),每次按照题意往下递归,需要注意对于“x个”“y个”千万不要反复递归,而是用一次递归的结果乘上“x”或“y”,要不然时间就炸了。注意边界就是l为1,此时col为true(红)则返回0,否则返回1。
- 代码:
#include<bits/stdc++.h>
using namespace std;
long long f[11][2]={};
int n=0,x=0,y=0;
long long dfs(int l,bool col);
//dfs函数,实现记忆化搜索(真不想写dp)。这里要注意会爆int。
int main(){
scanf("%d%d%d",&n,&x,&y);
//输入
printf("%lld\n",dfs(n,true));
//输出答案,其中递归入口是n个红色珠宝
return 0;
}
long long dfs(int l,bool col){
if(f[l][col]!=0){
return f[l][col];
}
//记忆化
if(col==true){
//红色珠宝
if(l==1){
f[l][col]=0;
//出口:只有一个一级的
return 0;
}
f[l][col]=dfs(l-1,true)+x*dfs(l,false);
//否则按照题目里操作①往下递归,并记忆
return f[l][col];
}
if(col==false){
//蓝色珠宝
if(l==1){
f[l][col]=1;
//出口:只有一个一级的
return 1;
}
f[l][col]=dfs(l-1,true)+y*dfs(l-1,false);
//否则按照题目里操作②往下递归,并记忆
return f[l][col];
}
}