動態規劃解各種子串行問題

2021-06-25 12:33:22 字數 1838 閱讀 2167

1、最長公共序列(lcs)

#include #include using namespace std;

#define up 1

#define left 2

#define slope 3

int dp[50][50];

int road[50][50];

char a = "algorithm";

char b = "altruistic";

void print(int x, int y)

else if(road[x][y] == left)

print(x, y-1);

else

print(x-1, y);

}int lcs()

else

}} return dp[len1][len2];

}int main(void)

2、最大子串行和

#include using namespace std;

int a = ;

int dp[30], x = -1;

int lss()

} return ret;

}void suffix()

cout << "具有最大和子串行的下標位置為:" << i+1 << " " << x << endl;

}int main(void)

3、最長遞增子串行長度(lis)

#include using namespace std;

int a = ;

int dp[25];

int lis()

if(ret < dp[i])

ret = dp[i];

} return ret;

}int main(void)

4、最長連續公共子串行長度(最長公共子串)

#include using namespace std;

int opt[65535];

int max(int a, int b)

int maxsublen(const char *src, const char *trg)

else

opt[i] = 0;

} }return largest;

}int main(void)

5、矩陣最大子矩陣和

#include using namespace std;

const int m = 3, n = 3;

int a[10][10] = , ,

};int b[10];

int dp[10];

int start, end;

int lss()

else

dp[i] = dp[i-1] + b[i];

// res = dp[i] > res ? dp[i] : res;

if(dp[i] > res)

}return res;

}int main(void)

}int t = lss();

if(maxv < t)

} }

cout << "第" << x1+1 << "行到" << x2 + 1 << "行,第" << y1+1 << "列到第" << y2+1 << "列構成的子矩陣和最大,為:" << maxv << endl;

return 0;

}

動態規劃解最長公共子串行問題

動態規劃法 經常會遇到複雜問題不能簡單地分解成幾個子問題,而會分解出一系列的子問題。簡單地採用把大問題分解成子問題,並綜合子問題的解匯出大問題的解的方法,問題求解耗時會按問題規模呈冪級數增加。為了節約重複求相同子問題的時間,引入乙個陣列,不管它們是否對最終解有用,把所有子問題的解存於該陣列中,這就是...

動態規劃解最長公共子串行問題

動態規劃法 經常會遇到複雜問題不能簡單地分解成幾個子問題,而會分解出一系列的子問題。簡單地採用把大問題分解成子問題,並綜合子問題的解匯出大問題的解的方法,問題求解耗時會按問題規模呈冪級數增加。為了節約重複求相同子問題的時間,引入乙個陣列,不管它們是否對最終解有用,把所有子問題的解存於該陣列中,這就是...

動態規劃解最長公共子串行問題

動態規劃法 經常會遇到複雜問題不能簡單地分解成幾個子問題,而會分解出一系列的子問題。簡單地採用把大問題分解成子問題,並綜合子問題的解匯出大問題的解的方法,問題求解耗時會按問題規模呈冪級數增加。為了節約重複求相同子問題的時間,引入乙個陣列,不管它們是否對最終解有用,把所有子問題的解存於該陣列中,這就是...