不同子序列
题意:输入一个只包含小写字母的字符串,求不同的非递减子序列的数量.
问题分析:
解法一:
抱歉,又是一道残缺题目,未公开原题,一些数据范围和示例不得而知,但还是不妨碍思考基本算法的。其实看到这个题目,我就想起了我之前写过的最长递增子序列——一维动态规划,算法是一模一样的,就认为他的数据范围比较小吧,不考虑复杂度过大超时的情况,再经过简单的数学推导就可以知道答案啦~代码和推论如下
已知一个集合有n个元素,则它的子集有2n个,真子集有2N-1个,非空子集也为2^N-1
#include <bits/stdc++.h>
using namespace std;
int main()
{
string a;
int dp[100001];
int i,j;
cin >> a;
for ( i=0; i<a.length(); i++ )
dp[i] = 1;
for ( j=1; j<a.length(); j++ )
for ( i=0; i<j; i++ )
if ( a[j]>=a[i] && dp[j]<dp[i]+1 )
dp[j] = dp[i]&