牛客竞赛每日俩题 - 动态规划2
创始人
2024-01-20 17:30:18

目录

经典DP - 走方格

        走方格2.0

分割回文串

        分割回文串 - 回文优化


经典DP - 走方格

不同路径的数目(一)_牛客题霸_牛客网

状态:         子状态:从(0,0)到达(1,0),(1,1),(2,1),...(m-1,n-1)的路径数         F(i,j): 从(0,0)到达F(i,j)的路径数 状态递推:         F(i,j) = F(i-1,j) + F(i,j-1) 初始化:         特殊情况:第0行和第0列         F(0,i) = 1         F(i,0) = 1 返回结果:         F(m-1,n-1)

class Solution {
public:int uniquePaths(int m, int n) {if(m<1||n<1) return 0;vector> ret(m,vector(n,1));for(int i=1;i

走方格2.0

带权值的最小路径和_牛客题霸_牛客网

状态:         子状态:从(0,0)到达(1,0),(1,1),(2,1),...(m-1,n-1)的最短路径         F(i,j): 从(0,0)到达F(i,j)的最短路径 状态递推:         F(i,j) = min{F(i-1,j) , F(i,j-1)} + (i,j) 初始化:         F(0,0) = (0,0)         特殊情况:第0行和第0列         F(0,i) = F(0,i-1) + (0,i)         F(i,0) = F(i-1,0) + (i,0) 返回结果:         F(m-1,n-1)

class Solution {
public:int minPathSum(vector >& grid) {if(grid.empty()||grid[0].empty()) return 0;int m=grid.size();int n=grid[0].size();vector> ret(m,vector(n,0));ret[0][0]=grid[0][0];for(int i=1;i!=m;i++) ret[i][0]=ret[i-1][0]+grid[i][0];for(int i=1;i!=n;i++) ret[0][i]=ret[0][i-1]+grid[0][i];for(int i=1;i

分割回文串

分割回文串-ii_牛客题霸_牛客网

状态:         子状态:到第1,2,3,...,n个字符需要的最小分割数         F(i): 到第i个字符需要的最小分割数 状态递推:         F(i) = min{F(i), 1 + F(j)}, 当 jj, j+1-->i都为回文串。 初始化:         F(i) = i - 1         上式表示到第i个字符需要的最大分割数         比如单个字符只需要切0次,因为单子符都为回文串         2个字符最大需要1次,3个2次...... 返回结果:         F(n)

举个栗子: 对于字符串"aabaa",对于当 j

f[0]=-1;则字符串“a”有min(f[1],1+f[0])==0;

对字符串“aa”有min(f[2],1+f[0])==min(1,0)==0;

对字符串“aab”有min(f[3],1+f[1])==min(2,1)==1;

对字符串“aaba”有min(f[4],1+f[1])==min(3,1)==1;(a|aba)

.......

沿途会遍历所有分割方法,取最小值

class Solution {public:int minCut(string s) {if (s.empty()) return 0;int len = s.size();vector cut;// F(i)初始化// F(0)= -1,必要项,如果没有这一项,对于重叠字符串“aaaaa”会产生错误的结果for (int i = 0; i < 1 + len; ++i) {cut.push_back(i - 1);//最大分割数随字符增加}for (int i = 1; i < 1 + len; ++i) {for (int j = 0; j < i; ++j) {// F(i) = min{F(i), 1 + F(j)}, 当 j
上述方法两次循环时间复杂度是O(n^2), 判断回文串时间复杂度是O(n), 所以总时间复杂度为O(n^3) 对于过长的字符串,在OJ的时候会出现TLE(Time Limit Exceeded)

 分割回文串 - 回文优化

状态:         从第一个字符到第二个字符是不是回文串,第1-3,第2-5,...         F(i,j): 字符区间 [i,j] 是否为回文串 状态递推:         F(i,j): true->{s[i]==s[j] && F(i+1,j-1)} 否则false         上式表示如果字符区间首尾字符相同且在去掉区间首尾字符后字符区间仍为回文串,         则原字符区间为回文串         从递推公式中可以看到第i处需要用到第i+1处的信息,所以i应该从字符串末尾遍历 初始化:         F(i,j) = false 返回结果:         矩阵F(n,n), 只更新一半值(i <= j),n^2 / 2

举个栗子:

我们看递推公式发现 true->{s[i]==s[j] && F(i+1,j-1)}更新所需要的状态是下一行的前一列,也就是说要从下往上更新

for (int i = len - 1; i >= 0; --i) {//从最后一行开始更新for (int j = i; j < len; ++j) {if (j == i) {// 一个字符mat[i][j] = true;} else if (j == i + 1) {// 只有两个mat[i][j] = (s[i] == s[j]);} else {mat[i][j] = ((s[i] == s[j]) && mat[i + 1][j - 1]);}}

class Solution {public:int minCut(string s) {if (s.empty()) return 0;int len = s.size();vector cut;for (int i = 0; i < 1 + len; ++i) {cut.push_back(i - 1);}vector > mat = getMat(s);//dp回文串for (int i = 1; i < 1 + len; ++i) {for (int j = 0; j < i; ++j) {if (mat[j][i - 1]) {cut[i] = min(cut[i], 1 + cut[j]);}}}return cut[len];}vector > getMat(string s) {int len = s.size();vector > mat = vector >(len, vector(len,false));for (int i = len - 1; i >= 0; --i) {for (int j = i; j < len; ++j) {if (j == i) mat[i][j] = true;else if (j == i + 1) mat[i][j] = (s[i] == s[j]);else mat[i][j] = ((s[i] == s[j]) && mat[i + 1][j - 1]);}}return mat;}
};

判断回文串的方法可以继续优化,使总体时间复杂度将为O(n^2) 

 

相关内容

热门资讯

猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
为什么不能摸死人的手 家里要死... 在这个世界上,亲人离世无疑是最痛苦的事情,面对离去的已逝之人,一时间是无法接受的,他们会在这样的情况...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...