标签:
题目:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=24269
代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
using namespace std;
int dp[15][10];
int ans;
int bit[15];
void init()
{
memset(dp,0,sizeof(dp));
for(int i=0;i<=9;i++)
{
dp[1][i]=1;
}
for(int i=2;i<=10;i++)
{
for(int j=0;j<=9;j++)
{
for(int k=0;k<=9;k++)
{
if(abs(j-k)>=2)
dp[i][j]=dp[i][j]+dp[i-1][k];
}
}
}
/*for(int i=1;i<=3;i++)
{
for(int j=0;j<=9;j++)
{
printf("%d ",dp[i][j]);
}
printf("\n");
}*/
}
int solve(int x) // 321
{
ans=0;
memset(bit,0,sizeof(bit));
int len=0;
while(x)
{
bit[++len]=x%10;
x=x/10;
}
bit[len+1]=0;
for(int i=1;i<len;i++) // 1-99
{
for(int j=1;j<=9;j++)
{
ans=ans+dp[i][j];
//printf("%d\n",dp[i][j]);
}
}
//printf("%d\n",ans);
for(int i=1;i<bit[len];i++) // 100-300
{
ans=ans+dp[len][i];
}
//printf("%d\n",ans);
for(int i=len-1;i>=0;i--) // 301-321
{
for(int j=0;j<bit[i];j++)
{
if(abs(j-bit[i+1])>=2)
ans=ans+dp[i][j];
}
if(abs(bit[i]-bit[i+1])<2)
break;
}
//printf("%d\n",ans);
return ans;
}
int main()
{
init();
int n,m;
while(~scanf("%d%d",&n,&m))
{
printf("%d\n",solve(m+1)-solve(n));
}
}
数位DP的大体思路:
用预处理一个表,从这个表中找答案。
dp【2】【3】表示30到39之间满足题意的数即 30 31 35 36 37 38 39.
dp【3】【2】表示200-300之间满足题意的数。
现在想求321到1之间的满足的题意的数。
找1-99 100-300 301-321 相加。
还有就是为什么m+1.不太懂呀。
1 2 3 4 5 6 7 8 9 10
学习数位DP时的代码。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
using namespace std;
int dp[15][10];
void init()
{
memset(dp,0,sizeof(dp));
for(int i=0;i<=9;i++)
{
dp[1][i]=1;
}
for(int i=2;i<=10;i++)
{
for(int j=0;j<10;j++) // 首位
{
for(int k=0;k<10;k++) // 首位的下一位
{
if(abs(j-k)>=2)
dp[i][j]=dp[i][j]+dp[i-1][k];
}
}
}
}
int a[5];
int judge(int x)
{
int k=x;
int i=0;
while(k)
{
a[i++]=k%10;
k=k/10;
}
//printf("%d %d %d ",a[0],a[1],a[2]);
if(abs(a[0]-a[1])>=2&&abs(a[1]-a[2])>=2)
return 1;
else return 0;
}
int main()
{
init();
for(int i=1;i<10;i++)
{
for(int j=0;j<10;j++)
{
printf("%d ",dp[i][j]);
}
printf("\n");
}
for(int i=900;i<=999;i++)
{
if(judge(i))
printf("%d ",i);
if(i%10==0)
printf("\n");
}
}
标签:
原文地址:http://blog.csdn.net/qq_32473657/article/details/51366901