关闭

FZU 2109 Mountain Number [数位DP]【动态规划】

标签: 动态规划dp
161人阅读 评论(0) 收藏 举报
分类:

题目链接:http://acm.fzu.edu.cn/problem.php?pid=2109
——————————–.
Problem 2109 Mountain Number
Accept: 231 Submit: 592
Time Limit: 1000 mSec Memory Limit : 32768 KB

Problem Description

One integer number x is called “Mountain Number” if:

(1) x>0 and x is an integer;

(2) Assume x=a[0]a[1]…a[len-2]a[len-1](0≤a[i]≤9, a[0] is positive). Any a[2i+1] is larger or equal to a[2i] and a[2i+2](if exists).

For example, 111, 132, 893, 7 are “Mountain Number” while 123, 10, 76889 are not “Mountain Number”.

Now you are given L and R, how many “Mountain Number” can be found between L and R (inclusive) ?

Input

The first line of the input contains an integer T (T≤100), indicating the number of test cases.

Then T cases, for any case, only two integers L and R (1≤L≤R≤1,000,000,000).

Output

For each test case, output the number of “Mountain Number” between L and R in a single line.
Sample Input

3
1 10
1 100
1 1000
Sample Output

9
54
384
Source

“高教社杯”第三届福建省大学生程序设计竞赛

—————————————————————.
题目大意:
就是给你一个区间[l,r]
问你在这个区间内满足从高位起偶数位的数字要>=两边的数字 这样的有多少个

解题思路:
标准的数位DP
dp[第多少位][上一位的数字][奇数位or偶数位];
开这样一个数组 然后DP就行了
我用的记忆华搜索
dfs(int pos,int weishu,int pre,int limit)
dfs(第多少位,位数,上一位的数字,限制);

决策的时候

    for(int i=0; i<=endi; i++)
    {
        if(weishu==1) //表示前面还是只有前导0
            if(i==0)    res+=dfs(pos-1,weishu  ,9,limit&&(i==endi));
            else        res+=dfs(pos-1,weishu+1,i,limit&&(i==endi));

        if(weishu%2==1&&weishu!=1)//奇数位
            if(pre>=i)  res+=dfs(pos-1,weishu+1,i,limit&&(i==endi));

        if(weishu%2==0)  //偶数位
            if(pre<=i)  res+=dfs(pos-1,weishu+1,i,limit&&(i==endi));
    }

如果觉得还是wrong的注意下输出是%lld 还是%I64d
%lld 就会返回wrong answer
还有就是FZU不支持 #include < bits/stdc++.h>

附本题代码
————————————————.

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;

typedef long long LL;
const int MOD  = 1e9+7;
const int maxn = 200010;

int num[70],len;
LL  dp[50][12][5];

LL dfs(int pos,int weishu,int pre,int limit)
{
    if(pos < 0)    return 1;

    if(dp[pos][pre][weishu%2]!=-1&&!limit)
        return dp[pos][pre][weishu%2];

    int endi = 9;
    if(limit) endi = num[pos];

    LL res = 0;
    for(int i=0; i<=endi; i++)
    {
        if(weishu==1)
            if(i==0)    res+=dfs(pos-1,weishu  ,9,limit&&(i==endi));
            else        res+=dfs(pos-1,weishu+1,i,limit&&(i==endi));

        if(weishu%2==1&&weishu!=1)
            if(pre>=i)  res+=dfs(pos-1,weishu+1,i,limit&&(i==endi));

        if(weishu%2==0)
            if(pre<=i)  res+=dfs(pos-1,weishu+1,i,limit&&(i==endi));
    }

    if(!limit) dp[pos][pre][weishu%2] = res;
    return res;
}

LL solve(LL n)
{
    len = 0;

    while(n)
    {
        num[len++] = n%10;
        n /= 10;
    }

    return dfs(len-1,1,9,1);
}

int main()
{
    memset(dp,-1,sizeof(dp));

    int _,p=0;
    scanf("%d",&_);
    while(_--)
    {
        LL n,m;
        scanf("%I64d%I64d",&m,&n);
       // printf("%lld %lld\n",solve(n),solve(m-1));
        printf("%I64d\n",solve(n)-solve(m-1));
    }
    return 0;
}
0
0
查看评论

FZU 2109 Mountain Number (数位DP)

One integer number x is called "Mountain Number" if: (1) x>0 and x is an integer; (2) Assume x=a[0]a[1]...a[len-2]a[len-1](0≤a[i]≤9, a[...
  • h1021456873
  • h1021456873
  • 2017-03-03 12:03
  • 101

FZU 2109 Mountain Number ---数位dp

http://www.cnblogs.com/woaishizhan/archive/2013/05/10/3070391.html #include #include #include #include using namespace std; #define inf 0x3f3f3f3...
  • u010489389
  • u010489389
  • 2014-02-20 13:36
  • 472

FZU - 2109 Mountain Number 数位DP

题目大意:参考点击打开链接 解题思路:如果不懂可以问,讨论了能加深了解#include #include int dp[12][12][2],data[12]; //pos表示当前位,pre表示前一位的数是多少,parity表示该位是奇数位还是偶数位,jud表示是否有前导零,board前面那一...
  • L123012013048
  • L123012013048
  • 2014-11-25 20:21
  • 547

FZU - 2109 Mountain Number

题 目 传 送 门:  x=a[0]a[1]...a[len-2]a[len-1],所有下标为奇数的数都>=他左右的数的称为Mountain Number ,找L~R中Mountain Number的个数 思路:数位dp,dp[i][j][k],i表示第i位,j表示奇数位...
  • tianyuhang123
  • tianyuhang123
  • 2017-08-21 16:17
  • 43

fzu 2109 Mountain Number 数位DP 递推

题意:Mountain Number 是奇数位的数不小于相邻偶数位的数的数字, 求一个闭区间内的山峰数有多少。 如果把一个Mountain Number 首项删掉 会变成偶数位的数不小于相邻奇数位的数的数字,再删掉又变成Mountain Number。状态的转移很显然!#include #incl...
  • vvv_557
  • vvv_557
  • 2017-03-04 16:36
  • 111

FZU - 2109 Mountain Number

题意:求满足奇数位的数大于与它相邻的偶数位上的数,求[L,R]之间有多少个 思路:考虑首位与不考虑首位是不同的,这是关键啊,然后逐位考虑每一位上的数,记忆化搜索 #include #include #include #include using namespace std; const ...
  • u011345136
  • u011345136
  • 2013-11-28 20:20
  • 708

fzu 2109 Mountain Number

题目链接:http://acm.fzu.edu.cn/problem.php?pid=2109 题目大意: 设x=a[0]a[1]a[2]....a[len-1],对任意a[2*i+1]大于a[2*i]和a[2*i+2]。 求L~R(1 题目思路: 第一道数位dp。 df...
  • gotoac
  • gotoac
  • 2013-04-27 15:52
  • 721

fzu 2109 Mountain Number 数位DP 记忆化搜索

做法:按位暴力DFS吧... 这里很明显没有考虑当前数字是否是首位,其实不需要啊,因为这种情况发生的时候肯定是那种比边界数少一位的数字。也就是说如果求1234 那么这里要考虑的是 0 ---999的 数字中的mountain, 没有考虑首位的后果是moutain的形态不同,可是很容易证明,规定位...
  • cqlf__
  • cqlf__
  • 2013-02-28 21:39
  • 935

FZU 2109 Mountain Number_数位DP

原题: Problem Description One integer number x is called "Mountain Number" if: (1) x>0 and x is an integer; (2) Assume x=a[0]a[1].....
  • u011343989
  • u011343989
  • 2014-02-22 11:11
  • 434

fzu 2109(数位dp)

Problem 2109 Mountain Number Accept: 67    Submit: 176 Time Limit: 1000 mSec    Memory Limit : 32768 KB ...
  • q775968375
  • q775968375
  • 2013-08-10 22:47
  • 1051
    个人资料
    • 访问:132342次
    • 积分:4602
    • 等级:
    • 排名:第7605名
    • 原创:332篇
    • 转载:6篇
    • 译文:0篇
    • 评论:57条
    听歌啊
    最新评论