每天写两题动态规划

32. 最长有效括号

给你一个只包含 '('')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。

思路:用栈模拟,左括号入队,右括号就更新一下答案,初始放入一个-1,避免开始空的出错。

  1. class Solution {
  2. public:
  3. int longestValidParentheses(string s) {
  4. vector<int> a;
  5. int ans=0;
  6. a.push_back(-1);
  7. for(int i=0;i<s.size();i++){
  8. if(s[i]=='(') a.push_back(i);
  9. else{
  10. a.pop_back();
  11. if(a.empty()) a.push_back(i);
  12. else{
  13. ans=max(i-a.back(),ans);
  14. }
  15. }
  16. }
  17. return ans;
  18. }
  19. };

62. 不同路径

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。

问总共有多少条不同的路径?

思路:

简单题

每一个格子都只能从左边,和上边的一格递推过来。所以递推方程:

动态规划 专题训练 - 图1

代码:

  1. class Solution {
  2. public:
  3. int uniquePaths(int m, int n) {
  4. vector<vector<int> > dp(n+1,vector<int>(m+1,0));
  5. dp[0][0]=0;
  6. dp[1][1]=1;
  7. for(int i=1;i<=n;i++){
  8. for(int j=1;j<=m;j++){
  9. dp[i][j]+=dp[i-1][j]+dp[i][j-1];
  10. }
  11. }
  12. return dp[n][m];
  13. }
  14. };

``<br />