m代表什么数字(M代表什么数字单位)

2022-12-22:给定一个数字n,代表数组的长度,

给定一个数字m,代表数组每个位置都可以在1~m之间选择数字,

所有长度为n的数组中,最长递增子序列长度为3的数组,叫做达标数组。

返回达标数组的数量。

1 <= n <= 500,

1 <= m <= 10,

500 * 10 * 10 * 10,

结果对998244353取模,

实现的时候没有取模的逻辑,因为非重点。

来自微众银行。

答案2022-12-22:

参考最长递增子序列。

代码用rust编写。代码如下:

use std::iter::repeat;
fn main() {
    println!("功能测试开始");
    for n in 4..=8 {
        for m in 1..=5 {
            let ans1 = number1(n, m);
            let ans2 = number2(n, m);
            if ans1 != ans2 {
                println!("{}", ans1);
                println!("{}", ans2);
                println!("出错了!");
            }
        }
    }
    println!("功能测试结束");
}


// 暴力方法
// 为了验证
fn number1(n: i32, m: i32) -> i32 {
    let mut a: Vec<i32> = repeat(0).take(n as usize).collect();
    return process1(0, n, m, &mut a);
}


fn process1(i: i32, n: i32, m: i32, path: &mut Vec<i32>) -> i32 {
    if i == n {
        return if length_of_lis(path) == 3 { 1 } else { 0 };
    } else {
        let mut ans = 0;
        for cur in 1..=m {
            path[i as usize] = cur;
            ans += process1(i + 1, n, m, path);
        }
        return ans;
    }
}


fn length_of_lis(arr: &mut Vec<i32>) -> i32 {
    if arr.len() == 0 {
        return 0;
    }
    let mut ends: Vec<i32> = repeat(0).take(arr.len()).collect();
    ends[0] = arr[0];
    let mut right = 0;
    let mut max = 1;
    for i in 1..arr.len() as i32 {
        let mut l = 0;
        let mut r = right;
        while l <= r {
            let mut m = (l + r) / 2;
            if arr[i as usize] > ends[m as usize] {
                l = m + 1;
            } else {
                r = m - 1;
            }
        }
        right = get_max(right, l);
        ends[l as usize] = arr[i as usize];
        max = get_max(max, l + 1);
    }
    return max;
}


fn get_max<T: Clone + Copy + std::cmp::PartialOrd>(a: T, b: T) -> T {
    if a > b {
        a
    } else {
        b
    }
}
// i : 当前来到的下标
// f、s、t : ends数组中放置的数字!
// ? == 0,没放!
// n : 一共的长度!
// m : 每一位,都可以在1~m中随意选择数字
// 返回值:i..... 有几个合法的数组!
fn zuo(i: i32, f: i32, s: i32, t: i32, n: i32, m: i32) -> i32 {
    if i == n {
        return if f != 0 && s != 0 && t != 0 { 1 } else { 0 };
    }
    // i < n
    let mut ans = 0;
    for cur in 1..=m {
        if f == 0 || f >= cur {
            ans += zuo(i + 1, cur, s, t, n, m);
        } else if s == 0 || s >= cur {
            ans += zuo(i + 1, f, cur, t, n, m);
        } else if t == 0 || t >= cur {
            ans += zuo(i + 1, f, s, cur, n, m);
        }
    }
    return ans;
}


// 正式方法
// 需要看最长递增子序列!
// 尤其是理解ends数组的意义!
fn number2(n: i32, m: i32) -> i32 {
    //repeat(vec![]).take((m+1) as usize).collect();
    let mut dp: Vec<Vec<Vec<Vec<i32>>>> = repeat(
        repeat(
            repeat(repeat(-1).take((m + 1) as usize).collect())
                .take((m + 1) as usize)
                .collect(),
        )
        .take((m + 1) as usize)
        .collect(),
    )
    .take(n as usize)
    .collect();
    return process2(0, 0, 0, 0, n, m, &mut dp);
}


fn process2(
    i: i32,
    f: i32,
    s: i32,
    t: i32,
    n: i32,
    m: i32,
    dp: &mut Vec<Vec<Vec<Vec<i32>>>>,
) -> i32 {
    if i == n {
        return if f != 0 && s != 0 && t != 0 { 1 } else { 0 };
    }
    if dp[i as usize][f as usize][s as usize][t as usize] != -1 {
        return dp[i as usize][f as usize][s as usize][t as usize];
    }
    let mut ans = 0;
    for cur in 1..=m {
        if f == 0 || cur <= f {
            ans += process2(i + 1, cur, s, t, n, m, dp);
        } else if s == 0 || cur <= s {
            ans += process2(i + 1, f, cur, t, n, m, dp);
        } else if t == 0 || cur <= t {
            ans += process2(i + 1, f, s, cur, n, m, dp);
        }
    }
    dp[i as usize][f as usize][s as usize][t as usize] = ans;
    return ans;
}
m代表什么数字(M代表什么数字单位)

本文所有内容来自互联网,如有侵权/不实内容请联系我们删除,联系邮箱postusb@foxmail.com

发布者:缘分,转转请注明出处:https://www.bjxdyg.com/baike/114526.html

(0)
缘分缘分
上一篇 2023年 3月 8日 下午12:03
下一篇 2023年 3月 8日 下午12:17

相关推荐

  • 电脑键盘无法输入任何东西(为什么键盘打不了字)

    在互联网生活发达的今天,电脑已经成为了学习工作的必备工具。而用来操作电脑的关键,就是我们经常使用的键盘和鼠标。最近有不少的小伙伴来私信小编,希望小编做一个电脑键盘功能基础知识介绍的详细教程。这不,小编应大家要求,跟大家分享一下电脑键盘各个按键的作用。 电脑键盘功能基础知识1:常用键盘分区键盘作为我们日常使用电脑的工具之一,想要快速学电脑的基本知识,就必须要了…

    2023年 3月 29日
    12200
  • 9.7寸ipad多大(9.7寸ipad多大比书本大吗)

    2010年1月,乔布斯在美国芳草地艺术中心正式发布了初代iPad,至今已过去了8个年头。 和智能手机一样,平板电脑也不是苹果发明的,在iPad前的10年,甚至20年,市场上就不止一次出现过类似产品,但人们现在记住的却只有iPad。 我还记得8年前的那场发布会,乔布斯说,个人电脑已经日新月异,苹果又重新定义了手机。那么,市场是否还能容纳介乎于两者之间的第三者?…

    社会百科 2023年 5月 11日
    14200
  • 李延年歌是什么(李延年歌是什么意思)

    罗袂兮无声,玉墀(chí)兮尘生。 虚房冷而寂寞, 落叶依于重扃(jiōng)。 望彼美之女兮,安得感余心之未宁? 这首短诗,名叫《落叶哀蝉曲》,作者是汉武帝刘彻,是他为亡姬李夫人而写。 意思是说: 你走了以后,从此我的耳边再也听不见那绸裙的窸窣声了。 宫殿的台阶上满布着灰尘,没人的房间空荡而寂寥,落叶凄凄地飘零,依附于门闩上。 我心中至爱,你,已长眠泥土下…

    2023年 4月 25日
    16400
  • 0.2千克等于多少克(0.28千克等于多少克)

    近日,湖北武汉一男子在天鲜配宅送网络平台上买了一些新鲜蔬菜。送上门后,该男子发现标有600克的两根胡萝卜的质量根本未达到这个数值,便在手机上向商家平台提出了质疑。商家便让该男子将这两根胡萝卜复一下秤,然后拍照发过来看看。结果就是这一看,引起两人的强烈争执。 照片中显示这两根胡萝卜只有0.35千克,即350克,该男子要商家给个说法。而商家竟然说,这是公斤秤,两…

    社会百科 2023年 7月 7日
    27400
  • 身份认证大全2021真实有效(身份证号码2021)

    纸质合同的信任机制主要建立在法律规范完善、司法实践丰富的基础上,组织机构或个人签订纸质合同,往往只需签字或盖章即可达成契约关系。然而,电子合同是不同的。 首先,作为一种新的合同签订方式,其法律规范和司法实践还需要完善和丰富。其次,电子合同主要应用于线上场景。签约双方通过网络平台进行签约操作,身份认证、签名/印章、如何保存合同都是需要解决的问题。 随着电子签名…

    社会百科 2022年 8月 22日
    56800

发表回复

登录后才能评论

联系邮箱

postusb@foxmail.com

邮箱咨询: QQ交谈

邮箱:postusb@foxmail.com

工作时间:周一至周五,9:30-18:30,节假日休息