Final Kichiku “Lanlanshu”

题目链接

  • 题意:

    至今也没看懂题目叙述。。。弱菜,看别人程序看懂题意得。。。

    给一串字符串,包含‘/’  ‘\’    ‘-’三种,分别表示下一个数比当前大,小,相等。要求出[a, b]区间内,满足要求的数有多少个:要求是,将字符串分成若干段,每段的符号均相同。再将数字也分成若干段,那么数字每一段与字符串的每一段对应,且数字段内相邻数的上升、下降、相等关系应满足对应字符串的符号关系,且每段数字段的数字个数应该大于等于对应符号段的符号个数。

  • 分析:

    数位DP解决时,状态为[pos][idx][pre],分别表示当前到数字串的第几位,对应的符号串的第几位,当前位的前一位数字是多少

    注意前导零的处理即可

const int MAXN = 110;

int dp[MAXN][MAXN][10];
char comp[MAXN], ipta[MAXN], iptb[MAXN];
char* bits;
int len, lcp;

bool check(int a, int b, char cp)
{
    if (cp == '-') return a == b;
    else if (cp == '/') return a < b;
    else return a > b;
}

int dfs(int pos, int idx, int pre, bool lmt, bool fst)
{
    if (pos == len)
    {
        return idx == lcp;
    }
    if (!lmt && !fst && ~dp[pos][idx][pre])
        return dp[pos][idx][pre];
    int e = 9, ret = 0;
    e = lmt ? bits[pos] - '0' : 9;
    FE(i, 0, e)
    {
        if (fst)
            ret += dfs(pos + 1, idx, i, lmt && i == e, fst && !i);
        else
        {
            if (idx < lcp && check(pre, i, comp[idx]))
                ret += dfs(pos + 1, idx + 1, i, lmt && i == e, 0);
            else if (idx > 0 && check(pre, i, comp[idx - 1]))
                ret += dfs(pos + 1, idx, i, lmt && i == e, 0);
        }
        ret %= MOD;
    }
    return lmt || fst ? ret : dp[pos][idx][pre] = ret;
}

int calc(char x[], bool sub)
{
    CLR(dp, -1);
    len = strlen(x);
    int t = 0;
    while (x[t] == '0')
        t++;
    if (t >= len) return 0;
    if (sub)
        for (int i = len - 1; i >= t; i--)
        {
            if (x[i] != '0')
            {
                x[i]--;
                break;
            }
            else
            {
                x[i] = '9';
            }
        }
    bits = x;
    return dfs(t, 0, 0, true, true);
}

int main()
{
    while (~RS(comp))
    {
        lcp = strlen(comp);
        scanf("%s%s", ipta, iptb);
        printf("%08d\n", ((calc(iptb, false) - calc(ipta, true)) % MOD + MOD) % MOD);
    }
    return 0;
}
时间: 2024-10-11 21:25:14

Final Kichiku “Lanlanshu”的相关文章

hdu 3886 Final Kichiku “Lanlanshu” (数位dp)

http://acm.hdu.edu.cn/showproblem.php?pid=3886 给出一个字符,只含'/','-' ,'\' ,表示着一个数上的各位数字按相应字符上升,不变或下降,问[a,b]区间内这样的数有多少个? 数组很好设,dp[i][j][k]表示处理到第i位,它对应的字符是第j位,它前面的数字是k的种类数. 令我纠结好久的是,我起初设的dp[i][j][k]表示处理到第i位时,它的上一位对应的字符是第j位,它的上一位数字是k的种类数,这样可能会导致一个'/'只有一个数字,但

[数位dp] hdu 3886 Final Kichiku “Lanlanshu”

题意: 在范围内满足所给的运算符的数有多少个. "/" 代表前面的比后面的小 "-"代表前面和后面一样 "\" 代表前面的比后面的大 测试过会出现重复的符号 比如 "///\" 思路: 细心啊细心啊..!! 数位dp,按位dp 注意几个点就好了: 1.n个运算符至少要有n+1个数. 2.注意开始的状态,第一个数以及第一个运算符. 3.运算符后移注意移动到结束标识就直接返回0. 4.运算符能往后移就往后移. 5.注意大数减一的计

【HDOJ】3386 Final Kichiku “Lanlanshu”

数位DP.需要注意的是需要特殊处理前导0,另外连续的==匹配,不要计重了,尽量贪心的匹配掉. 1 /* 3886 */ 2 #include <iostream> 3 #include <sstream> 4 #include <string> 5 #include <map> 6 #include <queue> 7 #include <set> 8 #include <stack> 9 #include <vec

final

在JAVA中,继承提高的代码的复用性,但是随之而来的,也产生一个弊端,即打破了"封装性",比如父类可以被子类复写,代码的安全性降低了. 在实际工作中,为了提高安全性,避免有的数据被继承复写或修改,这就要用到final进行修饰. final,其字面意思含义是"最终",表示已到终点,不能被改变.继承 1.可以修饰类.函数.变量 2.被final修饰的类(可以称为最终类),不可以被继承,被复写. 3.被final修饰的函数,不可以被复写. 4.被final修饰的变量是一个

R:incomplete final line found by readTableHeader on

报错: In read.table("abc.txt", header = T) :  incomplete final line found by readTableHeader on 'abc.txt' 解决方法: 在数据文件abc.txt最后一行加上回车即可解决.

final使用

final修饰  基本数据类型时候   对应的 数据不能改变:::final修饰 对象类型 ,那么对应的引用地址不能改变(对象中的值可以改变): 如果final修改方法,那么该方法不能被子类重写 ::::  如果修饰类,那么该类就是最终类,不能被继承. 如果final 修改对象中 成员变量,那么这个变量不能被set(不能再级再进行赋值操作)

PHP 面向对象中常见关键字使用(final、static、const和instanceof)

PHP 面向对象中常见关键字的使用: 00x1.Final :final关键字可以加在类或者类中方法之前,但是不能使用final标识成员属性. 作用: 使用final标识的类,不能被继承. 在类中使用final标识的成员方法,在子类中不能覆盖. 总结:final表示为最终的意思,所以使用final关键字的类或者类中的成员方法是不能被更改的. 00x2.Static :static关键字将类中的成员属性或者成员方法标识为静态的,static标识的成员属性属于整个类,static成员总是唯一存在的,

JAVA之旅(七)——final关键字 , 抽象类abstract,模板方法模式,接口interface,implements,特点,扩展

JAVA之旅(七)--final关键字 , 抽象类abstract,模板方法模式,接口interface,implements,特点,扩展 OK,我们继续学习JAVA,美滋滋的 一.final 我们来聊聊final这个关键字 final可以修饰类,方法和变量 final修饰的类不可以被继承 final修饰的方法不可以被覆盖 final修饰的变量是一个常量,只能被赋值一次 内部类只能访问被final修饰的局部变量 final,故名思意,就是最终的意思,由以上的五种特性,不过final的出现,也是有

浅析Java中的final关键字

原文出处: 海子 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法.下面是本文的目录大纲: 一.final关键字的基本用法 二.深入理解final关键字 若有不正之处,请多多谅解并欢迎指正. 一.final关键字的基本用法 在Java中,final关键字可以用来修饰类.方法和变量(包括成员变量和局部变量).下面就从这三个方面来了解一下final关键字