相关概念:
状态:子问题相关的各个变量的一组取值。
无后效性:子问题的解取值与解题路径无关。
动态规划:
解题步骤:
1.将原问题分解为子问题。
2.确定状态。
3.确定边界状态。
4.确定状态转移方程。
特点:
1.问题具有最优子结构
2.无后效性。
求最长子序列的算法问题描述:
解题思路:
1.将原问题分解为子问题,并且子问题满足无后效性。
以 a[i]为终点 对应的最长序列为子问题。
2.确定状态。
maxLen(a【i】)=maxLen(a【k】)+1,其中a【k】为小于a【i】的数.
3.确定边界状态。
当a【i】为第一个数时,对应的maxLen=1.
4.方程确定。
maxLen(a【i】)=maxLen(a【k】)+1 ( i!=0)
maxLen=1. (i>0)
java代码:
/**
*
* @param k 要求的以此数字为终点的子序列对应数组下标
* @param arr 传入的数组
* @return 最长原序列子序列长度
*/
static public int maxLen(int k, int[] arr) {
int j = 0; // 比arr[k]小的,且距离最近
int tempLen=0;
String temp="";
if (k == 1) {
return 1;
} else {
for (int i = k - 1; i >= 0; i--) {
if (arr[i] < arr[k]) {
j+=1;
temp=temp+","+Integer.toString(i); //会多出一个逗号,如",1,2,3,4"
}
}
if (j != 0) {
temp=temp.substring(1,temp.length());//去掉第一个“,”
String [] e=temp.split(","); //去掉逗号存放在字符串数组
for(String b:e) {
j=Integer.parseInt(b);
if(tempLen<maxLen(j, arr))
tempLen=maxLen(j, arr);
}
return tempLen+ 1;
} else {
return 1;
}
}