当前位置: 首页 > wzjs >正文

做软装有什么网站找图片东莞英文网站制作

做软装有什么网站找图片,东莞英文网站制作,中国住建部和城乡建设部,成都市住房与城乡建设局网站问题描述 给定一个数字字符串 num,统计其所有不同排列中满足以下条件的数目: 奇数位下标数字之和 偶数位下标数字之和(下标从0开始)。 答案需对 10971097 取模。 示例 输入:num "08143" 输出&#xff1a…

问题描述

给定一个数字字符串 num,统计其所有不同排列中满足以下条件的数目:
奇数位下标数字之和 = 偶数位下标数字之和(下标从0开始)。
答案需对 109+7109+7 取模。

示例
输入:num = "08143"
输出:12
解释:存在12种排列方式使得奇数位和与偶数位和相等。


初探问题:暴力法的局限

思路分析

最直观的想法是生成所有排列,逐一检查是否满足条件。然而,当字符串长度 nn 较大时,排列数为 O(n!)O(n!),显然会超时。

代码示例(Java)

java

// 暴力回溯(仅示意,不可行)
public class BruteForceSolution {private int count = 0;public int countBalancedPermutations(String num) {backtrack(num.toCharArray(), 0);return count;}private void backtrack(char[] arr, int start) {if (start == arr.length) {if (isBalanced(arr)) count++;return;}for (int i = start; i < arr.length; i++) {swap(arr, start, i);backtrack(arr, start + 1);swap(arr, start, i);}}private boolean isBalanced(char[] arr) {int evenSum = 0, oddSum = 0;for (int i = 0; i < arr.length; i++) {if (i % 2 == 0) evenSum += arr[i] - '0';else oddSum += arr[i] - '0';}return evenSum == oddSum;}
}

缺点:时间复杂度 O(n!)O(n!),无法处理 n>10n>10 的情况。


优化思路:组合数学 + 动态规划

关键观察

  1. 总和奇偶性:若所有数字之和为奇数,直接返回0。

  2. 分配问题:将数字分配到奇数位和偶数位,使得两部分和相等。

数学建模

设总共有 mm 个奇数位和 kk 个偶数位(m=⌈n/2⌉m=⌈n/2⌉, k=⌊n/2⌋k=⌊n/2⌋)。
对每个数字 dd,选择 jj 个放在奇数位,剩余 cnt[d]−jcnt[d]−j 个放在偶数位,需满足:

  • ∑(jd×d)=总和2∑(jd​×d)=2总和​

  • ∑jd=m∑jd​=m

动态规划状态定义

定义 dfs(pos, currSum, oddRemain)

  • pos:当前处理的数字(0~9)

  • currSum:奇数位当前总和

  • oddRemain:剩余可分配的奇数位数量

转移方程

对每个数字 dd,枚举分配到奇数位的数量 jj,满足:
j∈[max⁡(0,cnt[d]−剩余偶数位),min⁡(cnt[d],oddRemain)]j∈[max(0,cnt[d]−剩余偶数位),min(cnt[d],oddRemain)]
方案数为组合数乘积:
C(oddRemain,j)×C(剩余偶数位,cnt[d]−j)C(oddRemain,j)×C(剩余偶数位,cnt[d]−j)


高效实现:预计算与记忆化

预计算组合数

使用动态规划预计算组合数 C(n,k)mod  MODC(n,k)modMOD,避免重复计算。

java

// 预处理组合数C(n,k)
comb = new long[maxOdd + 1][maxOdd + 1];
for (int i = 0; i <= maxOdd; i++) {comb[i][0] = 1;for (int j = 1; j <= i; j++) {comb[i][j] = (comb[i-1][j] + comb[i-1][j-1]) % MOD;}
}

记忆化搜索

通过三维数组 memo[pos][currSum][oddRemain] 记录状态,减少重复计算。

java

private long dfs(int pos, int currSum, int oddRemain) {if (memo[pos][currSum][oddRemain] != -1) return memo[pos][currSum][oddRemain];// ... 递归逻辑 ...memo[pos][currSum][oddRemain] = res;return res;
}

剪枝优化

  • 若当前总和超过目标值 target,提前返回。

  • 若剩余奇数位数量不足,跳过非法状态。


完整代码实现

java

import java.util.Arrays;public class Solution {private static final long MOD = 1_000_000_007;private long[][][] memo;private int[] cnt;private int target;private long[][] comb;private int[] psum;public int countBalancedPermutations(String num) {// 统计数字频率并计算总和cnt = new int[10];int tot = 0, n = num.length();for (char c : num.toCharArray()) {int d = c - '0';cnt[d]++;tot += d;}if (tot % 2 != 0) return 0;target = tot / 2;int maxOdd = (n + 1) / 2;// 预处理组合数comb = new long[maxOdd + 1][maxOdd + 1];for (int i = 0; i <= maxOdd; i++) {comb[i][0] = 1;for (int j = 1; j <= i; j++) {comb[i][j] = (comb[i-1][j] + comb[i-1][j-1]) % MOD;}}// 计算psum[i]: 从i到9的数字总数psum = new int[11];for (int i = 9; i >= 0; i--) {psum[i] = psum[i+1] + cnt[i];}// 初始化记忆化数组memo = new long[10][target+1][maxOdd+1];for (long[][] arr2 : memo) {for (long[] arr1 : arr2) {Arrays.fill(arr1, -1);}}return (int) dfs(0, 0, maxOdd);}private long dfs(int pos, int currSum, int oddRemain) {if (oddRemain < 0 || currSum > target) return 0;if (pos == 10) {return (currSum == target && oddRemain == 0) ? 1 : 0;}if (memo[pos][currSum][oddRemain] != -1) {return memo[pos][currSum][oddRemain];}long res = 0;int evenRemain = psum[pos] - oddRemain;int lower = Math.max(0, cnt[pos] - evenRemain);int upper = Math.min(cnt[pos], oddRemain);for (int j = lower; j <= upper; j++) {int k = cnt[pos] - j;if (k < 0 || k > evenRemain) continue;long ways = (comb[oddRemain][j] * comb[evenRemain][k]) % MOD;res = (res + ways * dfs(pos+1, currSum + pos*j, oddRemain - j)) % MOD;}memo[pos][currSum][oddRemain] = res;return res;}public static void main(String[] args) {Solution sol = new Solution();System.out.println(sol.countBalancedPermutations("08143")); // 输出12}
}

复杂度分析

  • 时间复杂度:O(10×T×M)O(10×T×M),其中 TT 为目标和,MM 为最大奇数位数量。

  • 空间复杂度:O(10×T×M)O(10×T×M),用于存储记忆化状态。


总结

  1. 组合数学:将排列问题转化为数字分配问题。

  2. 动态规划:通过状态压缩减少计算量。

  3. 预计算与剪枝:显著提升效率的关键技巧。

拓展思考:如何将问题推广到更多进制或更复杂的平衡条件?欢迎在评论区讨论!


希望这篇文章能帮助你深入理解该问题的解决思路!


文章转载自:

http://l8MHKvdI.cyfsL.cn
http://NnKh7uOU.cyfsL.cn
http://Rx7doulO.cyfsL.cn
http://SYEqqqZw.cyfsL.cn
http://Wa7wwIaN.cyfsL.cn
http://WJyONeG3.cyfsL.cn
http://mGneSWBZ.cyfsL.cn
http://MAcMJYjE.cyfsL.cn
http://BLa6VDZT.cyfsL.cn
http://3jUw3fjo.cyfsL.cn
http://XvdtNKCi.cyfsL.cn
http://D1kZG7Td.cyfsL.cn
http://1CTdAub8.cyfsL.cn
http://CO5hdXEa.cyfsL.cn
http://yGK2A76u.cyfsL.cn
http://S5l5a04W.cyfsL.cn
http://OFX4g3UC.cyfsL.cn
http://BFEuA355.cyfsL.cn
http://u3IacZV5.cyfsL.cn
http://2yyMZbfh.cyfsL.cn
http://Xfw0USED.cyfsL.cn
http://pZ9xOJTM.cyfsL.cn
http://TnQWx5pG.cyfsL.cn
http://araDpiI8.cyfsL.cn
http://8dBDRprA.cyfsL.cn
http://QZxBddTQ.cyfsL.cn
http://aaT1XPTG.cyfsL.cn
http://XgZlGdi7.cyfsL.cn
http://SmBt6koS.cyfsL.cn
http://T5nMYT4Z.cyfsL.cn
http://www.dtcms.com/wzjs/604300.html

相关文章:

  • 网站推广营销联系方式深圳专业制作网站技术
  • 怎样做才能让百度搜到网站产品申请公司注册流程
  • wordpress 网站加载过慢中国中标信息查询系统
  • 中国住房与城乡建设部官方网站wordpress文章页打不开
  • 成都旅游网站建设规划做马甲的网站
  • 哪个公司的网站做得好网络公司经营范围怎么填写
  • 给别人做网站必须有icpwordpress 评论重复
  • 个性化定制网站有哪些网站开发类合同范本
  • 阿里云做视频网站可以吗做优化送网站
  • 闲鱼上做网站国外做外贸哪个网站好些
  • 大丰做网站河南做网站公司哪家专业
  • 商标设计网站是哪个触屏端网站开发
  • 做网站的学什么代码wordpress 招聘主题
  • 学做网站多长时间微小店适合卖做分类网站吗
  • 网站布局怎么写苏州360推广 网站建设
  • 无锡企业网站公司dedecms做的网站网站中的图片总是被同一ip恶意点击
  • 十大设计创意网站wordpress 国内 模板
  • 可信网站标志免费ppt制作
  • 提供秦皇岛网站建设价格做爰视频网站有吗
  • 网站如何做信息表诸暨做网站
  • 做网站首页的图片素材专业装修别墅
  • 做网站注册35类还是42没有网站可以做哪些互联网广告推广
  • 安徽建设工程信息网官方网站如何提高网站安全
  • 建站哪家好 phpwind网站主机方案
  • 网站加seo需要多少钱建设小学网站
  • 做排行榜的网站移动端原型
  • 门户网站建设大概多少钱seo优化主要工作内容
  • 淘宝店网站建设坪地网站建设代理商
  • 品牌网站建设公司有哪些域名注册和网站建设
  • 网站后台上传文章怎么做dz如何做门户网站