Chinaunix首页 | 论坛 | 博客
  • 博客访问: 40218
  • 博文数量: 37
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 372
  • 用 户 组: 普通用户
  • 注册时间: 2013-10-12 23:27
文章分类

全部博文(37)

文章存档

2014年(5)

2013年(32)

我的朋友

分类: C/C++

2013-12-04 16:46:14

DP.
假设dp[i][j]为T[j:end]作为子序列在S[i:end]中出现的次数,则有以下关系式
dp[i][j]=dp[i+1][j]+((T[j]==S[i])?1:0)*dp[i+1][j+1];
意思就是,T[j:end]作为子序列在S[i:end]中出现的次数,等于T[j]==S[i]时T[j+1:end]作为子串在S[i+1:end]中出现的次数,加上T[j:end]作为子串在S[i+1:end]中出现的次数



点击(此处)折叠或打开

  1. class Solution {
  2. public:
  3.     int numDistinct(string S, string T) {
  4.         if(T.length()>S.length()) return 0;
  5.         vector<vector<int>> dp(S.length()+1,vector<int>(T.length()+1,0));
  6.         for(int i=0;i<=S.length();i++) dp[i][T.length()]=1;
  7.         for(int i=S.length()-1;i>=0;i--)
  8.         {
  9.             for(int j=T.length()-1;j>=0;j--)
  10.             {
  11.                 dp[i][j]=dp[i+1][j]+((T[j]==S[i])?1:0)*dp[i+1][j+1];
  12.             }
  13.         }
  14.         return dp[0][0];
  15.     }
  16. };

阅读(383) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~