問題:
拿poj 2533來說。
sample input
71 7 3 5 9 4 8
sample output(最長上公升/非降子串行的長度)
解法一(o(n^2)):
如何把這個問題分解成子問題呢?經過分析,發現 「求以ak(k=1, 2, 3…n)為終點的最長上公升子串行的長度」是個好的子問題――這裡把乙個上公升子串行中最右邊的那個數,稱為該子串行的「終點」。雖然這個子問題和原問題形式上並不完全一樣,但是只要這n個子問題都解決了,那麼這n個子問題的解中,最大的那個就是整個問題的解。
由上所述的子問題只和乙個變數相關,就是數字的位置。因此序列中數的位置k 就是「狀態」,而狀態 k 對應的「值」,就是以ak做為「終點」的最長上公升子串行的長度。這個問題的狀態一共有n個。狀態定義出來後,轉移方程就不難想了。假定maxlen (k)表示以ak做為「終點」的最長上公升子串行的長度,那麼:
maxlen (1) = 1
maxlen (k) = max
stacksize = 0;
}void output()
}else}}
}int maxx = -1;
int finalindex;
for (int i = 0 ; i < len; i++)
}while(finalindex!=-1)
reverse(seq.begin(), seq.end());
// for (int i = 0 ; i < len; i++)
// cout << endl;
return maxx;
}//不減版本
int binsearch(int s,int e, int value)
else
}int middle = (e+s)/2;
if (value == stack[middle])//這裡決定是否要遞增,或者不減.注釋為遞增
return middle;
}if(value < stack[middle])
else
}//o(nlog(n))
int algorithm2()
else
}else
else}}
return stacksize;
}int main()
}else
}//output();
return 0;
}
最長公共子串行 最長遞增子串行 最長遞增公共子串行
求最長公共子串行 int dp maxn maxn int a maxn b maxn int main else dp i j max dp i 1 j dp i j 1 printf d n dp m n return 0 輸出最長公共子串行 int dp maxn maxn int d max...
最長公共子串行 最長連續公共子串行 最長遞增子串行
面試中除了排序問題,還會經常出現字串的子串行問題,這裡講解使用動態規劃解決三個常見的子串行問題 1 最長公共子串行問題 lcs,longest common subsequence problem 2 最長連續公共子串行問題 3 最長遞增子串行 lis,longest increment subse...
子串行1 最長遞增子串行
子串行問題本來就比子串和子陣列要難,因為子串行是不連續的,窮舉困難,而且子串行一般涉及兩個字串,一般來說都是讓求乙個最長子序列,涉及子串行和最值,那一定是動態規劃,o n2 1.定義dp陣列有兩種思路,第一種是乙個一維的dp陣列,兩次for迴圈來解決,dp i 的含義是在array陣列中,以arra...