题解:AtCoder Beginner Contest 260 C-Changing Jewels

题解: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。

  • 代码:

链接:Submission #42039094 - AtCoder Beginner Contest 260https://atcoder.jp/contests/abc260/submissions/42039094

#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];
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值