参考:http://www.hawstein.com/posts/dp-novice-to-advanced.html
动态规划里非常重要的两个概念:状态和状态转移方程。
根据子问题定义状态。你找到子问题,状态也就浮出水面了。
状态转移方程,描述状态之间是如何转移的。
参考:https://blog.csdn.net/baolibin528/article/details/52313660
import java.util.ArrayList;
//最长上升子序列
public class ZCSSZXL {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int arr[] = {23,9,15,40,7,41,3,1,5};
zcss(arr);
}
public static void zcss(int arr[])
{
int max = 1,maxIndex = 0;
int len = arr.length;
int lisNum[] = new int[len];//存储最长上升子序列
int selectNum[] = new int[len];//前驱
ArrayList<Integer> list = new ArrayList<Integer>();
for(int i = 1;i<len;i++)
{
lisNum[i]=1;
selectNum[i]=-1;
for(int j=0;j<i;j++)
{
if(arr[i]>=arr[j]&&lisNum[i]<lisNum[j]+1)
{
lisNum[i]=lisNum[j]+1;
selectNum[i]=j;
}
}
if(max<lisNum[i])
{
max = lisNum[i];更新整个数组最长递增子序列的最大值
maxIndex = i;//最长递增子序列的结尾下标值
}
}
System.out.println(max);
int current = maxIndex;
while(current>=0)
{
list.add(arr[current]);
//System.out.print(arr[current]+" ");
current = selectNum[current];
}
for(int i=list.size()-1;i>=0;i--)
{
System.out.print(list.get(i)+" ");
}
}
}