首页 > 其他分享 >三维动态规划

三维动态规划

时间:2025-01-10 13:33:17浏览次数:1  
标签:people int 三维 rest strs vector 动态 规划 mem

[Algo] 三维动态规划

fx1 - 暴力递归, fx2 - 记忆化搜索, fx3 - 严格位置依赖, fx4 - 状态压缩

1. 零和一

// 1. 零和一
// https://leetcode.cn/problems/ones-and-zeroes/
pair<int, int> zerosAndOnes(string &str)
{
    int zeros = 0, ones = 0;
    for (char ch : str)
    {
        if (ch == '0') zeros++;
        else if (ch == '1') ones++;
    }
    return make_pair(zeros, ones);
}
int f11(vector<string>& strs, int i, int z, int o)
{
    if (i == strs.size()) return 0;
    int p1 = f11(strs, i + 1, z, o);
    pair<int, int> zao = zerosAndOnes(strs[i]);
    if (zao.first <= z && zao.second <= o)
    {
        int p2 = f11(strs, i + 1, z - zao.first, o - zao.second);
        return max(p1, 1 + p2);
    }
    else return p1;
}
int f12(vector<string>& strs, int i, int z, int o, vector<vector<vector<int>>> &mem)
{
    if (i == strs.size()) return 0;
    if (mem[i][z][o] != -1) return mem[i][z][o];
    int p1 = f12(strs, i + 1, z, o, mem), ans = p1;
    pair<int, int> zao = zerosAndOnes(strs[i]);
    if (zao.first <= z && zao.second <= o)
    {
        int p2 = f12(strs, i + 1, z - zao.first, o - zao.second, mem);
        ans = max(p1, 1 + p2);
    }
    mem[i][z][o] = ans;
    return ans;
}
int f13(vector<string>& strs, int m, int n, vector<vector<vector<int>>> &dp)
{
    for (int i = strs.size() - 1; i >= 0; i--)
    for (int z = 0; z <= m; z++) for (int o = 0; o <= n; o++)
    {
        dp[i][z][o] = dp[i + 1][z][o];
        pair<int, int> zao = zerosAndOnes(strs[i]);
        if (zao.first <= z && zao.second <= o)
        dp[i][z][o] = max(dp[i + 1][z][o], 1 + dp[i + 1][z - zao.first][o - zao.second]);
    }
    return dp[0][m][n];
}
int f14(vector<string>& strs, int m, int n, vector<vector<int>> &dp)
{
    for (int i = strs.size() - 1; i >= 0; i--)
    {
        pair<int, int> zao = zerosAndOnes(strs[i]);
        for (int z = m; z >= zao.first; z--)
        for (int o = n; o >= zao.second; o--)
        dp[z][o] = max(dp[z][o], 1 + dp[z - zao.first][o - zao.second]);
    }
    return dp[m][n];
}
int findMaxForm(vector<string>& strs, int m, int n) {
    vector<vector<int>> dp(m + 1, vector<int>(n + 1));
    return f14(strs, m, n, dp);
}

2. 盈利计划

// 2. 盈利计划
// https://leetcode.cn/problems/profitable-schemes/description/
long f22(int i, int rest_people, int rest_profit, vector<int>& group, vector<int>& profit, vector<vector<vector<long>>>& mem)
{
    int task = group.size();
    if (mem[i][rest_people][rest_profit] != -1) return mem[i][rest_people][rest_profit];
    long ans;
    if (i == task || rest_people == 0) ans = rest_profit <= 0 ? 1 : 0; // 员工或任务已经耗尽
    else 
    {
        long p1 = f22(i + 1, rest_people, rest_profit, group, profit, mem);
        long p2 = 0;
        if (group[i] <= rest_people) p2 = f22(i + 1, rest_people - group[i], max(0, rest_profit - profit[i]), group, profit, mem);
        ans = (p1 + p2) % 1000000007;
    }
    mem[i][rest_people][rest_profit] = ans;
    return ans;
}
long f23(int n, int minProfit, vector<int>& group, vector<int>& profit, vector<vector<vector<long>>>& dp)
{
    int task = group.size();
    for (int rest_people = 0; rest_people <= n; rest_people++) dp[task][rest_people][0] = 1;
    for (int i = task - 1; i >= 0; i--)
    for (int rest_people = 0; rest_people <= n; rest_people++)
    for (int rest_profit = 0; rest_profit <= minProfit; rest_profit++)
    {
        dp[i][rest_people][rest_profit] = dp[i + 1][rest_people][rest_profit];
        if (group[i] <= rest_people) 
        dp[i][rest_people][rest_profit] = (dp[i][rest_people][rest_profit] + dp[i + 1][rest_people - group[i]][max(0, rest_profit - profit[i])]) % MOD;
    }
    return dp[0][n][minProfit];
}
long f24(int n, int minProfit, vector<int>& group, vector<int>& profit, vector<vector<long>>& dp)
{
    int task = group.size();
    for (int rest_people = 0; rest_people <= n; rest_people++) dp[rest_people][0] = 1;
    for (int i = task - 1; i >= 0; i--)
    for (int rest_people = n; rest_people >= 0; rest_people--)
    for (int rest_profit = minProfit; rest_profit >= 0; rest_profit--)
    {
        if (group[i] <= rest_people) 
        dp[rest_people][rest_profit] = (dp[rest_people][rest_profit] + dp[rest_people - group[i]][max(0, rest_profit - profit[i])]) % MOD;
    }
    return dp[n][minProfit];
}
int profitableSchemes(int n, int minProfit, vector<int>& group, vector<int>& profit) {
    vector<vector<long>> dp(n + 1, vector<long>(minProfit + 1));
    return f24(n, minProfit, group, profit, dp);
}

3. 矩阵中和能被 K 整除的路径

// 3. 矩阵中和能被 K 整除的路径
// https://leetcode.cn/problems/paths-in-matrix-whose-sum-is-divisible-by-k/description/
long f32(int i, int j, long mod, vector<vector<int>>& grid, int k, vector<vector<vector<long>>> &mem)
{
    int n = grid.size(), m = grid[0].size();
    if (i == n || j == m) return 0;
    if (mem[i][j][mod] != -1) return mem[i][j][mod];
    long ans;
    if (i == n - 1 && j == m - 1) ans = (mod + grid[i][j]) % k == 0 ? 1 : 0;
    else ans = (f32(i + 1, j, (mod + grid[i][j]) % k, grid, k, mem) + f32(i, j + 1, (mod + grid[i][j]) % k, grid, k, mem)) % MOD;
    mem[i][j][mod] = ans;
    return ans;
}
int numberOfPaths(vector<vector<int>>& grid, int k) {
    int n = grid.size(), m = grid[0].size(); long sum = 0;
    vector<vector<vector<long>>> mem(n, vector<vector<long>>(m, vector<long>(k, -1)));
    return f32(0, 0, 0, grid, k, mem);
}

标签:people,int,三维,rest,strs,vector,动态,规划,mem
From: https://www.cnblogs.com/yaoguyuan/p/18663802

相关文章

  • 洛谷题单指南-线段树的进阶用法-P3157 [CQOI2011] 动态逆序对
    原题链接:https://www.luogu.com.cn/problem/P3157题意解读:长度为n的序列,序列是1~n的排列,一共m个删除操作,每一个删除之前输出逆序对。解题思路:要计算静态的逆序对,可以通过树状数组、权值线段树等方式,时间复杂度都是O(nlogn)要计算动态的逆序对,算上每一次删除,暴力做法需要O(mnlo......
  • 【MATLAB源码-第51期】基于matlab的粒子群算法(PSO)的栅格地图路径规划。
    操作环境:MATLAB2022a1、算法描述粒子群算法(ParticleSwarmOptimization,简称PSO)是一种模拟鸟群觅食行为的启发式优化方法。以下是其详细描述:基本思想:鸟群在寻找食物时,每只鸟都会观察自己和其他鸟之间的距离,以及当前找到的食物的位置。每只鸟都会向自己历史上找到的最好食......
  • Eval-Expression.NET:动态执行C#脚本,类似Javascript的Eval函数功能
    我们都知道在JavaScript中,我们可以通过Eval来执行JavaScript字符串代码。下面推荐一个.Net版本的Eval的开源项目。01项目简介Eval-Expression.NET是一个非常强大工具,使得开发人员可以动态编译和执行C#代码和表达式。通过C#反射,还能轻松访问公共和私有方法、字段、属性值,并创建......
  • 编辑距离(二维动态规划)
    给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数  。你可以对一个单词进行如下三种操作:插入一个字符删除一个字符替换一个字符示例 1:输入:word1="horse",word2="ros"输出:3解释:horse->rorse(将'h'替换为'r')rorse-......
  • 科技风?写实风?教你设置多风格三维地图
    概述三维地图通过高度、深度、立体感等表现形式,能够真实还原地形地貌、城市建筑和空间结构。相比二维地图,它能够更清晰地展示复杂的地理数据,帮助用户快速理解空间关系,如地形起伏、建筑高度等。在实际应用中,我们可以将不同风格的三维地图作为项目的主体元素进行展示,山海鲸可视化提......
  • 最长公共子序列(二维动态规划)
    给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。例如,"ac......
  • MyBatis 动态 SQL、多表查询与注解开发详解
    MyBatis动态SQL、多表查询与注解开发详解1.MyBatis动态SQLMyBatis提供了强大的动态SQL功能,允许我们根据不同的条件拼接SQL语句,避免了手动拼接SQL的繁琐和错误。常见的动态SQL标签包括:if:用于条件判断,根据条件是否成立来决定是否拼接SQL片段。choose(when,ot......
  • 【YashanDB知识库】进行load data的时候报找不到动态库liblz4.so
    本文内容来自YashanDB官网,原文内容请见https://www.yashandb.com/newsinfo/7863047.html?templateId=1718516现象23.2版本的依赖项准备里指明,要依赖动态库:liblz4.so,liblz4.so.1,liblz4.so.1.9.3在执行loaddata的时候报找不到动态库liblz4.so操作系统在/lib64/目录下有liblz4.......
  • 【C++动态规划 数学】1039. 多边形三角剖分的最低得分|2130
    本文涉及知识点C++动态规划数学LeetCode1039.多边形三角剖分的最低得分你有一个凸的n边形,其每个顶点都有一个整数值。给定一个整数数组values,其中values[i]是第i个顶点的值(即顺时针顺序)。假设将多边形剖分为n-2个三角形。对于每个三角形,该三角形的值......
  • 最小路径和(二维动态规划)
    给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。 示例1:输入:grid=[[1,3,1],[1,5,1],[4,2,1]]输出:7解释:因为路径1→3→1→1→1的总和最小。示例2:输入:grid=[[1,2......