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

背包dp

 

lc08.11

二维dp解决完全背包问题

 

dp[i][j] 记录前 i 种硬币凑成 j 分的表示法数量

分“不选当前硬币”和“选当前硬币”两种情况递推

最终得到 n 分的所有组合数

class Solution {
typedef long long ll;
int mod=1e9+7;
public:
int waysToChange(int n) 
{
vector<int> coins={1,5,10,25};
// dp维度:dp[硬币种类][金额]
vector<vector<ll>> dp(4, vector<ll>(n+1, 0));
// 初始化:第0种硬币(1分)凑j分的表示法
for(int j=0;j<=n;j++)
dp[0][j] = 1;

for(int i=1;i<4;i++){
for(int j=0;j<=n;j++){
dp[i][j] = dp[i-1][j]; // 不选
if(j >= coins[i]){
dp[i][j] = (dp[i][j] + dp[i][j-coins[i]]) % mod; // 选

}
}
}
return (int)dp[3][n];
}
};

 

lc624

注意到 数组已按升序排好了~

class Solution {
public:
int maxDistance(vector<vector<int>>& arrays) {
int min1 = INT_MAX, min2 = INT_MAX, minIdx1 = -1;
int max1 = INT_MIN, max2 = INT_MIN, maxIdx1 = -1;
int n = arrays.size();
for(int i=0;i<n;i++)
{
int mn = arrays[i][0];
int mx = arrays[i].back();
// 更新最小值
if(mn < min1){
min2 = min1;
min1 = mn;
minIdx1 = i;
} else if(mn < min2){
min2 = mn;
}
// 更新最大值
if(mx > max1){
max2 = max1;
max1 = mx;
maxIdx1 = i;
} else if(mx > max2){
max2 = mx;
}
}
if(maxIdx1 != minIdx1){
return max1 - min1;
} else {
return max(max1 - min2, max2 - min1);
}

}
};

 

lc1814

移项后和我的hash说去叭

class Solution {
/*
nums[i] + rev(nums[j]) == nums[j] + rev(nums[i])
*/
int mod=1e9+7;
typedef long long ll;
public:
int countNicePairs(vector<int>& nums) 
{
int n=nums.size();
ll ret=0;
vector<int> revn;
for(auto& num:nums)
{
string s=to_string(num);
reverse(s.begin(),s.end());
int t=stoi(s);
revn.push_back(t);
}
unordered_map<int,int> hash;
for(int i=0;i<n;i++)
{
if(hash[nums[i]-revn[i]]>0)
ret+=hash[nums[i]-revn[i]];
hash[nums[i]-revn[i]]++;
}
int rets=ret%mod;
return rets;
}
};

 

lc1653

继承dp

if(s[i-1]=='a')

     dp[i][0]=dp[i-1][0];

 

dp[i][1]=min(dp[i-1][0],dp[i-1][1]);//可继承a

/*
输入:s = "aababbab"
输出:2
*/

class Solution {
public:
int minimumDeletions(string s)
{
int n=s.size();
vector<vector<int>> dp(n+1,vector(2,0));
for(int i=1;i<=n;i++)
{
if(s[i-1]=='a')
{
dp[i][0]=dp[i-1][0];
dp[i][1]=dp[i-1][1]+1;//turn b
}
else
{
dp[i][0]=dp[i-1][0]+1;
dp[i][1]=min(dp[i-1][0],dp[i-1][1]);//可继承a
}
}
return min(dp[n][0],dp[n][1]);
}
};

 

lc120

 class Solution {
public:
int minimumTotal(vector<vector<int>>& triangle) {
int n=triangle.size();
vector<int> dp(triangle[n-1].begin(),triangle[n-1].end());
for(int i=n-2;i>=0;--i)
{
for(int j=0;j<=i;++j)
{
dp[j]=min(dp[j],dp[j+1])+triangle[i][j];
}
}
return dp[0];
}
};

 

从上到下的写法

class Solution {
public:
int minimumTotal(vector<vector<int>>& triangle) 
{
int n=triangle.size();
vector<vector<int>> 
dp(n,vector<int>(n,0));

dp[0][0]=triangle[0][0];
for(int i=1;i<n;i++)
{
dp[i][0]=triangle[i][0]+dp[i-1][0];
for(int j=1;j<=i;j++)
//j上限为i
{         
dp[i][j]=triangle[i][j]+
min(dp[i-1][j],dp[i-1][j-1]);

dp[i][i] = triangle[i][i] + dp[i-1][i-1]; // 补充尾元素处理
}
}
int ret=INT_MAX;
for(int i=0;i<n;i++)
{
ret=min(ret,dp[n-1][i]);
}
return ret;
}
};

 

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

相关文章:

  • 低代码用户画像构建:结合知识图谱提升推荐精准度
  • JavaScript 二维数组操作示例
  • 【数值分析】13-线性方程组的解法-基本概念、迭代解法(1)
  • 解决规模化核心难题!Nature Commun.新策略实现大面积、高性能钙钛矿纳米线光电探测器
  • 门户网站模板想做网站怎么做
  • 专业门户网站的规划与建设无锡网站建设 首选众诺
  • 淄川响应式网站建设线上推广营销策划
  • zerotier内网穿透部署(rockylinux部署本地服务器)超详细~~~
  • Ubuntu环境中LLaMA Factory 的部署与配置—构建大语言模型微调平台
  • 建婚恋网站需要多少钱新会网站建设公司
  • MI50运算卡使用llama.cpp的ROCm后端运行Qwen3-Coder-30B-A3B的速度测试
  • 【图像处理基石】如何入门图像压缩编码技术?
  • 网站建设与管理实施方案企业建设网站怎么做账
  • 网站制作与网站建设实际报告文案发布平台
  • 开源项目合并新分支和本地修改指南
  • GJOI 11.5 题解
  • 网站建设是什么语言wan网站建设
  • 个人网站域名怎么起企业官方网站建设的流程
  • CTFHub Web进阶-Json Web Token通关5:修改签名算法
  • 华为OD机试 双机位A卷 - 上班之路 (JAVA Python C++ JS GO)
  • CEVA-DSP开发初识(一)
  • 峰均比降低技术(CFR)
  • 如何删除网站备案号房地产政策
  • 盐城网盐城网站建设站建设wordpress视频解析接口
  • 【CPKCOR-RA8D1】Home Assistant 物联网 ADC 电压温度计
  • STM32外设学习--DMA直接存储器读取(AD扫描程序,DMA搬运)--学习笔记。
  • 贵州网站开发制作公司开发公司各部门职责
  • FreeRTOS 学习:(十八)FreeRTOS 中断管理
  • 做外贸网站 怎么收钱池州哪里做网站
  • 介绍一下 机器人坐标转换的 RT 矩阵