动态规划:将子问题的解记录下来,(记忆花搜索)


从顶到底和最大的路径

状态:dp[i][j]

  • 走左边
  • 走右边

状态转移方程:

从边界开始(底开始),往上走,第[i][j]的状态就是最大的加上它自己。
dp[i][j] = max(dp[i + 1][j], dp[i + 1][j + 1]) + f[i][j]

//边界就是他自己
for (int j = 1; j <= N; j++)
{dp[N][j] = f[N][j];
}//从倒数第二层开始
for (int i = N - 1; i >= 1; i--)
{for (int j = 1; j <= i; j++) {dp[i][j] = max(dp[i + 1][j], dp[i + 1][j + 1]) + f[i][j];}
}cout << dp[1][1];

6
-2 11 -4 13 -5 -2


连续最大子序列和:到A[i]的值最大

状态:dp[i]

  • 自己就是最大
  • 前面加上自己是最大

状态转移方程:

从第一个开始:第i个的状态就是(自己)或者自己加上前面的。
dp[i] = max(dp[i], dp[i - 1] + f[i]);

void dynamicd()
{memset(dp, 0, sizeof(dp));int maxdp = 0;for (int i = 0; i < N; i++){dp[i] = max(dp[i], dp[i - 1] + f[i]);if (dp[i] > maxdp)maxdp = dp[i];}cout << maxdp;
}

最长非递减子序列(可以不连续)(LIS)

状态:dp[i]:在i 之前由dp[i]个非递减的序列元素

  • 递减
  • 非递减(相等或递增)

状态转移方程:

循环第i个数之前的每个数,并且找到比第i个数小并且找到dp最大的那个数
dp[i]=max{1,dp[j]+1} (j=0,1,2…(i-1)&& a[j]<=a[i])

void dynamicd()
{memset(dp, 0, sizeof(dp));dp[0] = 1;int ans = 0;for (int i = 1; i < N; i++){dp[i] = 1;for (int j = 0; j < i; j++){if (f[j]<=f[i] && dp[j] + 1>dp[i]) {dp[i] = dp[j] + 1;}}ans = max(ans, dp[i]);}cout << ans;
}

只记录最长非递归

memset(dp, 0, sizeof(dp));
dp[0] = 1;
int tmax = f[0];
for (int i = 1; i < N; i++)
{dp[i] = dp[i - 1];if (f[i] >= tmax) {tmax = f[i];dp[i]++;}
}
for (int i = 0; i < N; i++)
{cout << dp[i] << " ";
}

8
1 2 3 -9 3 9 0 11


最长公共子序列(可以不连续)(LCommonS)

两个字符串
状态dp[i][j]:长度为i的A串和长度为j的B串的LCS长度

  • A[i]=B[i]
  • A[i]!=B[i]

状态转移方程:

相等那比较的字母同时往后移
不相等dp取前面最大的
dp[i][j]=dp[i-1][j-1] +1(A[I]==B[J])
dp[i][j]=max(dp[i-1][j],dp[i][j-1])(A[I]!=B[J])
边界:dp[0][i]=dp[j][0]=0;(所以串从1开始读)

使用char[],头文件#include<cstring>不能使用gets()而应当使用gets_s(数组起始位置,数组长度)

初始化
[i][0]说明不与B数组比较那么应当为0,且数组读入应该从1开始

int dp[maxn][maxn];
char str1[maxn], str2[maxn];
int len1, len2;
void init()
{gets_s(str1 + 1, maxn - 1);gets_s(str2 + 1, maxn - 1);len1 = strlen(str1+1);len2 = strlen(str2+1);
}

先定义边界

int i = 0, j = 0;
dp[0][0] = 0;
//初始不与另一数组比较时 都为0
for (int i = 0; i <= len1; i++)
{dp[i][0] = 0;
}
for (int j = 0; j <= len2; j++)
{dp[0][j] = 0;
}

动态规划,得到每一点的公共子长度


for (int i = 1; i <=len1 ; i++)
{for (int j = 1; j <= len2; j++) {if (str1[i] == str2[j])dp[i][j] = dp[i-1][j-1]+1;else dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);}
}for (int  i = 0; i <= len1; i++)
{for (int j = 0; j <= len2; j++) {cout << dp[i][j] << " ";}cout << endl;
}

sadstory
adminsorry


最长回文子串

一个字符串s的最长回文子串
状态dp[i][j]表示s[i]至s[j]所表示的子串是否是回文子串(1是0非)

  • s[i]==s[j]
  • s[i]!=s[j]

状态转移方程:

如果s[i]==s[j]:如果i+1到j-1是回文串,则它也是回文串
如果s[i]!+s[j] 不可能是回文串:
d[i][j]=d[i+1][j-1](s[i]==s[j])
dp[i][j]=0 (s[i]!=s[j])
边界:长度为1或者2的子串
dp[i][i]=1,dp[i][i+1]=(s[i]==s[i+1])?1:0
按照子串的长度和子串的初始位置进行枚举//先枚举长度在枚举左端点。

先定义边界;

memset(dp, 0, sizeof(dp));
//最长回文子串,初始为1,如果没有回文子串的话就是1
int ans=1;
for (int i = 0; i < str.size(); i++)
{dp[i][i] = 1;if (i<str.size()-1){if (str[i] == str[i + 1]) {dp[i][i + 1] = 1;ans = 2;}}
}

先枚举最长回文长度,再枚举其中左端点的同时得到右端点

for (int l = 3; l <= str.size(); l++)//枚举子串的长度
{for (int i = 0; i + l - 1 < str.size(); i++)//枚举子串的其实端点{int j = i + l - 1;//右端点if (str[i] == str[j] && dp[i + 1][j - 1] == 1) {dp[i][j] = 1;ans = l;//最长回文子串长度}}}
cout << ans;

DAG最长路(关键路径)

有向无环图中最大权值的路:用邻接矩阵的方式

dp[ii]:从i出发能获得的最长路径长度
choice:记录i点的后继结点

void init()
{cin >> str;memset(dp, 0, sizeof(dp));memset(choice, -1, sizeof(choice));
}int DP(int i)
{if (dp[i] > 0)return dp[i];for (int j = 0; j < N; j++){if (G[i][j] != INF) {int temp = max( dp[i],DP(j) + G[i][j] );if (temp > dp[i]) {dp[i] = temp;choice[i] = j;//i的后继是j}}}return dp[i];
}

dp[i]:点i到终点ed的最长距离

void init()
{cin >> str;
//  memset(dp, 0, sizeof(dp));fill(dp, dp + maxn, -INF);memset(book, false, sizeof(book));memset(choice, -1, sizeof(choice));dp[ed] = 0;
}int DP(int i)
{if (book[i])return dp[i];book[i] = true;for (int j = 0; j < N; j++){if (G[i][j] != INF) {dp[i] = max( dp[i],DP(j) + G[i][j] );}}return dp[i];
}

输出路径

/*最大的dp[i]*/
void printPath(int i)
{printf("%d", i);while (choice[i]!=-1){i = choice[i];cout <<" "<< i<<" ";}
}

贪心动态规划分治

C++:动态规划DP;相关推荐

  1. 第4课 防卫导弹(第十章 动态规划--DP)

    //progream p10_04 /* 第4课 防卫导弹(第十章 动态规划--DP)  (<聪明人的游戏--信息学探秘 提高篇>) https://blog.csdn.net/weixi ...

  2. 动态规划dp(带模板题の超易懂版):01背包,完全背包,分组背包,多重背包,混合背包

    动态规划dp(带模板题の超易懂版):01背包,完全背包,分组背包,多重背包 01背包 && 完全背包 && 分组背包 の 视频教程:https://www.bilibi ...

  3. 【习题详解】动态规划DP:硬币游戏 蛋糕 游荡的奶牛 决斗

    动态规划DP 硬币 蛋糕塔 游荡的奶牛 格斗 硬币 题目描述 农夫约翰的奶牛喜欢玩硬币游戏,因此他发明了一种称为"Xoinc"的两人硬币游戏. 初始时,一个有N(5 <= N ...

  4. 动态规划: dp+递推——确定动态矩阵dp含义,确定每个状态下面临的选择和对结果值影响,选择符合题意的作为结果存储在dp中

    1.动态规划:每一个状态一定是由之前的状态推导出来的,通过总结归纳发现递推关系 2.解决动态规划问题的步骤: 确定dp数组(dp table)以及下标的含义: 每个单元内 题目所求的值,一维.二维 确 ...

  5. Datawhale编程——动态规划DP

    0-1背包问题 问题:有n个物品,第i个物品价值为vi,重量为wi,其中vi和wi均为非负数,背包的容量为W,W为非负数.现需要考虑如何选择装入背包的物品,使装入背包的物品总价值最大. 针对这个经典的 ...

  6. 《强化学习》中的 时序差分学习 Temporal-Difference Learning (基于与动态规划 DP 、蒙特卡洛方法 MC 的对比)

    前言: 学习了 Sutton 的<强化学习(第二版)>中时序差分学习的"预测"部分内容.前两章中,书介绍了 动态规划 与 蒙特卡洛方法 ,我们从二者与 时序差分学习 的 ...

  7. HDU2571 命运【动态规划DP】

    命运 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission ...

  8. 算法技能树2-蓝桥杯-python实现测试次数(摔手机)-动态规划(DP)

    文章目录 1.题目描述 2.python解题 1.知识点总结 1.题目描述 x星球的居民脾气不太好,但好在他们生气的时候唯一的异常举动是:摔手机. 各大厂商也就纷纷推出各种耐摔型手机.x星球的质监局规 ...

  9. 动态规划(dp)总结

    问题 T: [动态规划]质数和分解 题目描述 任何大于1的自然数n,都可以写成若干个大于等于2且小于等于n的质数之和的形式(包括只有一个数构成的和表达式的情况),并且可能有不止一种质数和的形式.例如9 ...

  10. 省选+NOI 第一部分 动态规划DP

    期望概率DP [整理]简单的数学期望和概率DP [整理]简单的数学期望和概率DP - nimphy - 博客园 期望&概率dp总结 期望&概率dp总结_十分残念的博客-CSDN博客 期 ...

最新文章

  1. 图像拼接--Construction and Refinement of Panoramic Mosaics with Global and Local Alignment
  2. 习题1.8 二分查找 (20 分)
  3. Android中的相对布局
  4. C++易被忽略的知识点:移动语义 左值右值
  5. Unity SRP自定义渲染管线 -- 3.Lights
  6. [转]docker入门(利用docker部署web应用)
  7. matlab cell计算,MATLAB Cell数组 | 学步园
  8. 机器学习介绍jc01
  9. 数据结构笔记(二十九)--最小生成树(prim算法思想)
  10. 归类常用控件GroupBox、TabControl、Expander
  11. bootstarp 网格系统
  12. 模拟微信发红包算法java实现
  13. 机器视觉需要掌握的知识
  14. 08CMS之新建独立页面
  15. JavaScript判断一个时间点在不在某段时间段范围之内
  16. 吴松计算机学院,IT|“创青春”创业大赛计算机学院选拔赛成功举行!
  17. 美团数据分析岗位面试题分享
  18. 车企如何趟过「软件的坑」,大众集团或将在中国寻求收购
  19. 视频剪辑APP开发制度解析
  20. 2022-2028全球与中国移动网络电话(mVOIP)市场现状及未来发展趋势

热门文章

  1. 如何用python裁剪图片
  2. matlab 求隐含波动率,matlab求解资产隐含波动率及无风险利率初探.doc
  3. SageMath域上多项式操作
  4. 前篇:1.公共技术点之面向对象六大原则
  5. 如何使用 JavaScript 和 Canvas 创建星形图案
  6. android contentprovider 生命周期,ContentProvider销毁/生命周期
  7. 阿里云ddns过程记录
  8. MATLAB绘制一幅中国地图
  9. C++引用、取地址符
  10. Android客户端与服务器通信