2012 CCC 第五题

CCC是清华大学和某大学主办的比赛,我参加的是题比较简单的选拔赛。第五题当时没时间做了。后来回家把第五题写了。是dp(记忆化搜)。代码可能有错,请多指教。
#include <iostream>
using namespace std;
#define MAX 101
#define INF (1<<29)
int dp[MAX][MAX][2];
int lef[MAX],rig[MAX];
bool clr[MAX];
/*int dfs(int a)
{
	int ans=0;
	if (a==-1) return 0;
	ans+=clr[a];
	ans+=dfs(lef[a]);
	ans+=dfs(rig[a]);
	dp[a][ans][clr[a]]=0;
	return ans;
}*/
int dfs(int a,int num,bool k)
{
	int ans=0;
	if (dp[a][num][k]!=-1) return dp[a][num][k];
	if (k==0)
	{
		if (lef[a]==-1||rig[a]==-1) return INF;
		ans=dfs(lef[a],num,1)+dfs(rig[a],num,1)+(clr[a]!=k);
	}
	
	if (num-k<0) return INF;
	if (k==1)
	{
		if (lef[a]==-1 && rig[a]==-1) return num-k==0?0:INF;
		ans+=(clr[a]!=k);
		if (lef[a]!=-1)
			ans+=min(dfs(lef[a],num-k,1),dfs(lef[a],num-k,0));
		if (rig[a]!=-1)
			ans+=min(dfs(rig[a],num-k,1),dfs(rig[a],num-k,0));
	}
	return dp[a][num][k]=ans;
}
int main()
{
	int n ,ret=INF;
	char in[5];
	int root,leave;
	scanf("%d",&n);
	for (int i=0;i<n;i++)
	{
		scanf("%d%d%s",lef+i,rig+i,in);
		if (lef[i]>0)lef[i]--;
		if (rig[i]>0)rig[i]--;
		if (in[0]=='R') clr[i]=0;
		else clr[i]=1;
	}
	memset(dp,0xff,sizeof(dp));
	//dfs(root);
	root=0;leave=0;
	for (int i=leave;i<=n;i++)
		ret=min(ret,min(dfs(root,i,0),dfs(root,i,1)));
	printf("%d\n",ret);
	return 0;
}
我把==打成!=了,查了一个多小时!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值