欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

POJ 1790 Base Numbers G++ dp 没掌握

程序员文章站 2022-03-23 17:49:01
...

POJ 1790 Base Numbers G++ dp 没掌握

POJ 1790 Base Numbers G++ dp 没掌握

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