2022-07-09:总长度为n的数组中,所有长度为k的子序列里,有多少子序列的和为偶数?
2022-07-09:总长度为n的数组中,所有长度为k的子序列里,有多少子序列的和为偶数?
答案2022-07-09:
方法一:递归,要i还是不要i。
方法二:动态规划。需要两张dp表。
代码用rust编写。代码如下:
use rand::Rng;
fn main() {
let nn: i32 = 20;
let vv: i32 = 30;
let test_time: i32 = 3000;
println!("测试开始");
for i in 0..test_time {
let n = rand::thread_rng().gen_range(0, nn) + 1;
let k = rand::thread_rng().gen_range(0, n) + 1;
let mut arr = random_array(n, vv);
let ans1 = number1(&mut arr, k);
let ans2 = number2(&mut arr, k);
if ans1 != ans2 {
println!("出错了!{}", i);
println!("ans1 = {}", ans1);
println!("ans2 = {}", ans2);
break;
}
}
println!("测试结束");
}
fn number1(arr: &mut Vec<i32>, k: i32) -> i32 {
if arr.len() == 0 || k < 1 || k > arr.len() as i32 {
return 0;
}
return process1(arr, 0, k, 0);
}
fn process1(arr: &mut Vec<i32>, index: i32, rest: i32, sum: i32) -> i32 {
if index == arr.len() as i32 {
return if rest == 0 && (sum & 1) == 0 { 1 } else { 0 };
} else {
return process1(arr, index + 1, rest, sum)
+ process1(arr, index + 1, rest - 1, sum + arr[index as usize]);
}
}
fn number2(arr: &mut Vec<i32>, k: i32) -> i32 {
if arr.len() == 0 || k < 1 || k > arr.len() as i32 {
return 0;
}
let n = arr.len() as i32;
// even[i][j] : 在前i个数的范围上(0...i-1),一定选j个数,加起来是偶数的子序列个数
// odd[i][j] : 在前i个数的范围上(0...i-1),一定选j个数,加起来是奇数的子序列个数
let mut even: Vec<Vec<i32>> = vec![];
let mut odd: Vec<Vec<i32>> = vec![];
for i in 0..n + 1 {
even.push(vec![]);
odd.push(vec![]);
for _ in 0..k + 1 {
even[i as usize].push(0);
odd[i as usize].push(0);
}
}
for i in 0..=n {
// even[0][0] = 1;
// even[1][0] = 1;
// even[2][0] = 1;
// even[n][0] = 1;
even[i as usize][0] = 1;
}
for i in 1..=n {
for j in 1..=get_min(i, k) {
even[i as usize][j as usize] = even[(i - 1) as usize][j as usize];
odd[i as usize][j as usize] = odd[(i - 1) as usize][j as usize];
even[i as usize][j as usize] += if (arr[(i - 1) as usize] & 1) == 0 {
even[(i - 1) as usize][(j - 1) as usize]
} else {
odd[(i - 1) as usize][(j - 1) as usize]
};
odd[i as usize][j as usize] += if (arr[(i - 1) as usize] & 1) == 0 {
odd[(i - 1) as usize][(j - 1) as usize]
} else {
even[(i - 1) as usize][(j - 1) as usize]
};
}
}
return even[n as usize][k as usize];
}
fn get_min<T: Clone + Copy + std::cmp::PartialOrd>(a: T, b: T) -> T {
if a < b {
a
} else {
b
}
}
// 为了测试
fn random_array(n: i32, v: i32) -> Vec<i32> {
let mut ans: Vec<i32> = vec![];
for _i in 0..n {
ans.push(rand::thread_rng().gen_range(0, v));
}
return ans;
}
执行结果如下:

2022-07-09:总长度为n的数组中,所有长度为k的子序列里,有多少子序列的和为偶数?的更多相关文章
- 数组中累加和为k的最大子数组的长度
package com.hzins.suanfa; import java.util.HashMap; public class demo { /** * 数组中累加和为k的最大子数组的长度 * @p ...
- [程序员代码面试指南]第9章-在两个长度相等的排序数组中找到第k小的数(二分)
题目 给定两个有序数组arr1和arr2,再给定一个整数k,返回所有的数中第k小的数. 题解 利用题目"在两个长度相等的排序数组中找到第上中位数"的函数 分类讨论 k < 1 ...
- C语言 数组输出,冒泡排序法,沉底排序法,二维数组输出,输出字母列长度,从随机数组中找重复数
#include <stdio.h> #define sum 3+4//宏定义是原封不动的使用used for test4 #include <time.h>//used fo ...
- 【算法30】从数组中选择k组长度为m的子数组,要求其和最小
原题链接:codeforce 267 Div2 C 问题描述: 给定长度为n的数组a[],从中选择k个长度为m的子数组,要求和最大. 形式描述为:选择$k$个子数组[$l_1$, $r_1$], [$ ...
- 有序数组的平方&长度最小的子数组&螺旋矩阵Ⅱ
一.有序数组的平方 977.有序数组的平方 leetcode链接 1.方法概述 双"指针"解法:因为数组本来是有序的,平方后可能出现的两端大数值大的情况.所以从数组两端开始遍历,谁 ...
- 2021.07.09 K-D树
2021.07.09 K-D树 前置知识 1.二叉搜索树 2.总是很长的替罪羊树 K-D树 建树 K-D树具有二叉搜索树的形态,对于每一个分类标准,小于标准的节点在父节点左边,大于标准的节点在父节点右 ...
- LEETCODE 07 09
最近忙着面试耽误了几天,今天刷了07,09都是字符串处理,一个是大数反转,一个是回文数判断,我都是转成字符串处理的,过了是过了,但是挺慢的,先记着,等有机会优化下 题目 给定一个 32 位有符号整数, ...
- 2019.07.09 纪中_B
错失AK记 2019.07.09[NOIP提高组]模拟 B 组 明明今天的题都很水,可就是没蒟蒻. 写题的时候: T0一眼高精(结果没切)T1看到2啊8啊果断转二进制观察,发现都是左移几位然后空出的位 ...
- 【AcWing】第 62 场周赛 【2022.07.30】
AcWing 4500. 三个元素 题目描述 给定一个长度为 \(n\) 的数组 \(r\_1,r\_2,-,r\_n\). 请你找到其中的三个元素 \(r\_a,r\_b,r\_c\),使得 \(r ...
- int(11)最大长度是多少,MySQL中varchar最大长度是多少(转)
int(11)最大长度是多少,MySQL中varchar最大长度是多少? int(11)最大长度是多少? 在SQL语句中int代表你要创建字段的类型,int代表整型,11代表字段的长度. 这个11代表 ...
随机推荐
- MySQLdb安装
yum seach MySQL-Python sudo yum install MySQL-python.x86_64 import MySQLdb
- KERNEL1
WHAT IS KERNEL KERNEL是一个负责连接计算机硬件与软件的一个模块,当软件对硬件进行调用的时候,或者发送一些置零的时候,KERNEL负责将这些指令转化并发送给CPU或者计算机中其他硬件 ...
- 【picoCTF]cookies write up
顾名思义,这一挑战涉及对cookie的简单操作.登录页面会显示一个搜索框,其中包含一个输入字段,用于检查您为其提供的 Cookie 类型. 点击链接,页面如下: 随便在框里输入内容,显示如下: 输出返 ...
- TCP通信聊天服务端和客户端(C/C++语言开发)附完整源码
距离上次学Python写的Python实现简单聊天室已经过去好久了,现在学c++又写了一遍,其实过程差不多,无非是语法的变化,目前仅实现最简单的一对一的通信,然后改就是了,接下来应该是多线程了,话不多 ...
- Less-4 报错注入
补坑:报错注入 当我们 union 无法注入的时候,可以使用报错注入,这里我们有三种报错注入,xpth语法错误和count()+rand()+floor()+group by重复组建错误 extrac ...
- 【读书笔记】Nice Families Of GF
目录 Nice Families Of GF rational rational algebraic D-finite总览 下定义 逻辑关系 例子 更多的例子和判别法 运算是否有性质? 运算是否有性质 ...
- StyleGAN 生成 AI 虚拟人脸,再也不怕侵犯肖像权
目录 什么是 StyleGAN 如何使用 StyleGAN 下载项目 修改项目 MSVC 运行项目 运行结果 什么是 StyleGAN GAN 是机器学习中的生成性对抗网络,目标是合成与真实图像无法区 ...
- Java面试——不安全的集合类
Java 中有许多的集合,常用的有List,Set,Queue,Map. 其中 List,Set,Queue都是Collection(集合),List<String>中<>的内 ...
- Linux无root权限conda初始化
pre { overflow-y: auto; max-height: 400px } img { max-width: 500px; max-height: 300px } 1. 给anaconda ...
- java代码审计-CSRF
0x01 前言 CSRF跨站请求伪造(Cross-site request forgery),当某个接口没有设置CSRF验证,点击了别人恶意的链接,可能会造成对这个接口发送相应的数据,造成某个数据被更 ...