POJ 1790 Base Numbers G++ dp 没掌握

#include <iostream>
#include <cstdio>
#include <string> 
#include <cstring> 
using namespace std;
//英语     看博友好分析    抄博友程序      dp     没掌握 
string s;
int dp[100];
int fun(int x)//进制有x位 
{
	string t=s.substr(s.size()-x);//进制数
	if(s[s.size()-x]=='0')return 0;//进制数第一位不为0
	if(s[0]=='0'&&s.size()-x>1)return 0;//数首位不能为0,除非数只有一位  去掉wa 
	memset(dp,0,sizeof(dp));
	
	dp[0]=1;//博友这有限定  不加也ac  
	for(int i=0;i<=s.size()-x;i++)//抄博友分析  前i位能凑出多少个合法数字
	{
		//没掌握
		int beg=i-x;
		if(beg<0)
		{
			beg=0;
		}
		for(int j=beg;j<i;j++)
		{
			if(i-j>1 && s[j]=='0')continue;//数字超过一位,而且有前导0
			if(i-j==x && s.substr(j,x)>=t)continue;//位数相等且数字不小于进制数
			dp[i]=dp[i]+dp[j];
		} 
	} 
	return dp[s.size()-x];
}
int main()
{
	while(1)
	{
		cin>>s;
		if(s=="#")
		{
			break;
		}
		int ans=0;
		for(int i=1;i<s.size();i++)
		{
			ans=ans+fun(i);
		}
		if(ans==0)
		{
			cout<<"The code "<<s<<" is invalid."<<endl;
		}else
		{
			cout<<"The code "<<s<<" can represent "<<ans<<" numbers."<<endl;
		}
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值