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

窗口dp|组合数学

 

 

lc3428

贡献法+组合数学

const int MOD = 1'000'000'007;
const int MX = 100'000;

long long F[MX]; // F[i] = i!
long long INV_F[MX]; // INV_F[i] = i!^-1

long long pow(long long x, int n) {
long long res = 1;
for (; n; n /= 2) {
if (n % 2) {
res = res * x % MOD;
}
x = x * x % MOD;
}
return res;
}

auto init = [] {
F[0] = 1;
for (int i = 1; i < MX; i++) {
F[i] = F[i - 1] * i % MOD;
}

    INV_F[MX - 1] = pow(F[MX - 1], MOD - 2);
for (int i = MX - 1; i; i--) {
INV_F[i - 1] = INV_F[i] * i % MOD;
}
return 0;
}();

long long comb(int n, int m) {
return F[n] * INV_F[m] % MOD * INV_F[n - m] % MOD;
}

class Solution {
public:
int minMaxSums(vector<int>& nums, int k) {
ranges::sort(nums);
int n = nums.size();
long long ans = 0;
for (int i = 0; i < n; i++) {
long long s = 0;
for (int j = 0; j < min(k, i + 1); j++) {
s += comb(i, j);
}
ans = (ans + s % MOD * (nums[i] + nums[n - 1 - i])) % MOD;
}
return ans;
}
};

错误的思路

eg. 1  2  3 

会漏算1,3这个子序列

class Solution {

    const int MOD = 1e9 + 7;

public:

    int minMaxSums(vector<int>& nums, int k) {

        int n = nums.size();

        long long ans = 0;

    

        vector<long long> pow2(n, 1);

        for (int i = 1; i < n; ++i) {

            pow2[i] = (pow2[i - 1] * 2) % MOD;

        }

 

        sort(nums.begin(), nums.end());

        for (int i = 0; i < n; ++i) {

            for (int j = i; j < n; ++j) {

                int len = j - i + 1;

                if (len > k) continue;

                long long cnt = (j == i) ? 1 : pow2[j - i - 1];

                ans = (ans + (nums[i] + nums[j]) * cnt) % MOD;

            }

        }

        return ans;

    }

};

 

lc1871

到 i 更新窗口+dp

 

if (s[i] == '0' && cnt > 0) 
dp[i] = true;

   //到 i 更新窗口
if (i >= maxJump && dp[i - maxJump])
--cnt;

 class Solution {
public:
bool canReach(string s, int minJump, int maxJump) {
int n = s.size();
vector<bool> dp(n, false);
dp[0] = true;


int cnt = 1;    //滑窗cnt初始化,一开始i = 0是可达的,所以cnt初始化为1
for (int i = minJump; i < n; ++i)

   {
if (s[i] == '0' && cnt > 0) 
dp[i] = true;

            //到 i 更新窗口
if (i >= maxJump && dp[i - maxJump])
--cnt;

            
if (dp[i - minJump + 1]) 
++cnt;

}
return dp[n - 1];
}
};

 

http://www.dtcms.com/a/577056.html

相关文章:

  • 【linux国庆练习】
  • 织梦cms怎么做双语网站wordpress网页小特效
  • 我的世界做壁纸的网站移动互联网开发心得体会
  • CST对电路板与地面平面耦合的电磁模拟
  • Apple授权登录开发流程
  • 告别手动导出:一键将思源笔记自动同步到 Git 仓库
  • OPPO 后端校招面试,过于简单了!
  • element表格的行列动态合并
  • C++ 零基础入门与冒泡排序深度实现
  • 鸿蒙harmony将注册的数据包装成json发送到后端的细节及过程
  • JavaWeb(后端进阶)
  • VOC浓度快速测定仪在厂界预警中的实战应用:PID传感器技术与数据分析
  • 【SRE】安装Grafana实践
  • 在 PHP 中打印数据(调试、输出内容)
  • 网站运营有什么用做公司网站需要了解哪些东西
  • 段描述符属性测试
  • Ubuntu安装mysql5.7及常见错误问题
  • 第四届图像处理、计算机视觉与机器学习国际学术会议(ICICML 2025)
  • 网站后台编辑网站开发科普书
  • 单位加强网站建设专门做素菜的网站
  • Rust 在内存安全方面的设计方案的核心思想是“共享不可变,可变不共享”
  • NXP的GUI Guider开发LVGL
  • 《金仓KingbaseES vs 达梦DM:从迁移到运维的全维度TCO实测对比》
  • 【开题答辩全过程】以 基于Java的相机专卖网的设计与实现为例,包含答辩的问题和答案
  • 增量爬取策略:如何持续监控贝壳网最新成交数据
  • 400Hz 橡胶弹性体动刚度扫频试验系统指标
  • Weavefox 携手 GLM-4.6/4.5V 打造新一代智能厨房小助手
  • 如何建立网站后台wordpress 主题 翻译
  • 深入理解 Java 双亲委派机制:JVM 类加载体系全解析
  • Linux 进程间关系与守护进程