【座右铭】1. 想要成为行家,就必须尝试解决大量的问题;
2. 解决大量问题并不代表能解决所有问题,而是表示解决下一个问题的几率变大了
1. 对于一个数组{1,2,3}它的子数组有{1,2},{1,3},{2,3},{1,2,3},元素之间可以不是连续的,对于数组 {5,9,1,7,2,6,3,8,10,4},升序子序列有多少个?或者换一种表达为:数组int a[]={5,9,1,7,2,6,3,8,10,4}。求其所有递增子数组(元素相对位置不变)的个数,例如:{5,9},{5,7,8,10},{1,2,6,8}。【问题来源于v_JULY_v的博客:http://blog.csdn.net/v_july_v/article/details/6855788】
在此仅考虑所有元素都不相同
第一部分:思路
用T[1...N]来表示数组,则Ti表示第i个元素;用Si表示以Ti为最后一个元素的升序序列的个数;则有如下推导式:
S1=0
Si=Si+Sj+1 if Ti>Tj 1<=j<i<=N
那么总共的升序序列个数就等于S1+S2+S3+...+SN
举例说明,考虑{1,2,3,4}这个数组
S2有1个升序序列:{1,2} <== S1 + 1
S3有3个升序序列:{1,3} <== S1 + 1; {2,3},{1,2,3} <== S2 +1
S4有7个升序序列:{1,4} <== S1 + 1; {2,4},{1,2,4} <== S2 + 1;{3,4},{1,3,4} {2,3,4},{1,2,3,4} <== S3 + 1
总共有11个
第二部分:Java代码,不考虑异常情况
//参数说明:source为数组,len为数组的长度
public static int increase(int[] source, int len)
{
int[] counter = new int[len];
counter[0] = 0;
for(int i=1;i<len;i++)
{
for(int j=i-1;j>=0;j--)
{
if(source[i]>source[j])
{
counter[i] += (counter[j] + 1);
}
}
}
int sum = 0;
for(int k=0;k<len;k++)
{
sum += counter[k];
}
return sum;
}
第三部分:测试用例
{1} : 0
{1,2,3,4}: 11
{1,4,3,2}: 3
{1,3,4,2,5}:14