题目
给一个整数类型的数组,或者给一个字符串,问题就是找出这个字符串里面,最长的递增子序列。【可能是严格递增的,也可能是不严格递增的,只需要在状态转移方程的时候,多加一个括号即可】
思想
无论如何,我们开一个动态规划数组dp。dp[i]表示的是,以当前nums[i]或者第i个字符结尾的子序列或者字符串的最长递增子序列。【注意:nums[i]或者第i个字符是一定要取的】
那么,dp[i]等于什么呢?最小值一定是1对吧【即只有本身这个数字或者字符】,然后,其他的可以从前面所有的数字或者字符中,只要数字或者字符比它小的,就可以加1后与当前值比较,如果大于,则更新dp[i]的数值。【加1是因为这个数字或者字符是一定要取到的】。并且,最长子序列不一定是在最后一个位置取到,因为它是当前位置一定要取到的,所以反而最后一个数字或者字符太小,限制了长度。我们每次在取完之后,就要更新当前的数值。
代码
//数字下标从0开始,因为0只有1个,所以不用进行dp。
//只需要从下标为1的位置开始dp即可
for (int i=1;i<length;++i)
{
dp[i]=1;//该状态由本身转化而来,至少有一个,即本身
for (int j=0;j<i;++j)
{
if (nums[i]>nums[j]) //可以由比它小的数这个状态转移过来,只要该数比它小就可以加1进行比较
dp[i]=Math.max(dp[i],dp[j]+1);
}
ans=Math.max(ans,dp[i]); //每次都要取出dp[i]中最大的那一个作为结果
}
结果
动态规划太秀了,真的6,大神的脑壳每天都在思考啥?