POJ 1790 Base Numbers G++ dp 没掌握
程序员文章站
2022-03-23 17:49:01
...
#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;
}
上一篇: JavaScript实现电池状态的方法
下一篇: 查看端口状态的命令是什么