1.最長單調遞增子串行(
從頭部到尾部是嚴格遞增的)
單調遞增的輔助陣列sort,k表示陣列sort目前的長度,演算法完成後k的值即為lis的長度。
初始化:sort[0] = a[0],k = 1
從前到後掃瞄陣列a,比較當前的數a[i]和sort[k-1]:
如果a[i]>sort[k-1],a[i]大於sort的最後乙個元素,a[i]直接插至sort的末尾,sort的長度增加1,sort[k++]=a[i];
如果a[i]
二分法t(n) = o(nlgn)
#include #include void print(int const *sort, int cnt)
else
}return low;
}void lis(int const *a, int n)
else
print(sort, cnt);
} printf("%d\n", cnt);
print(dp, n);
free(sort);
sort = null;
}int main(void)
else
}return low;
}void lis(int const *a, int n)
else
print(sort, cnt);
} printf("%d\n", cnt);
free(sort);
sort = null;
}int main(void)
else
}return low;
}void lds(int const *a, int n)
else
print(b, cnt);
} printf("%d\n", cnt);
print(dp, n);
free(b);
b = null;
}int main(void)
/*在公升序序列中二分查詢第乙個》key的座標*/
int bisearch(int *sort, int low, int high, int key)
else
}return low; /*第乙個大於key的座標*/
}void lis(int *a, int *sort, int *inc, int n)
else
}}void lds(int *a, int *sort, int *dec, int n)
else
}}int main(void)
{ int n;
// freopen("in.txt", "r", stdin);
while (scanf("%d", &n) != eof)
{ int i;
int max = 1;
int *a = (int *)malloc(sizeof(int)*n);
int *sort = (int *)malloc(sizeof(int)*n);
int *inc = (int *)malloc(sizeof(int)*n);
int *dec = (int *)malloc(sizeof(int)*n);
for (i=0; i
合唱隊形 動態規劃 最長遞增子串行
n位同學站成一排,老師要請其中的 n k 位同學出列,使得剩下的k位同學不交換位置就能排成合唱隊形。合唱隊形是指這樣的一種隊形 設k位同學從左到右依次編號為1,2,k,他們的身高分別為t1,t2,tk,則他們的身高滿足t1 t2 ti ti ti 1 tk 1 i k 你的任務是,已知所有n位同學的...
合唱隊形 題解(變形的最長遞增子串行)
注意 6 之前的 求最長遞增子列長度 問題裡的dp i 的值是1到i序列裡最長遞增子列的長度,這個最長遞增子列並不一定是以i為尾。7而本題的最長子列問題,a i 是以i點為尾的最長遞增子列 8演算法思路 分別從前往後和從後往前尋找以i點為尾的最長子列,尋找兩個子列和的最大值 9 intmain 16...
動態規劃之合唱隊形問題(最長遞增子串行變形)
題目描述 n位同學站成一排,老師要請其中的 n k 位同學出列,使得剩下的k位同學不交換位置就能排成合唱隊形。合唱隊形定義 設k位同學從左到右依次編號為1,2,k,他們的身高分別為t1,t2,tk,則他們的身高滿足t1 t2 ti,ti ti 1 tk 1 i k 要求 已知所有n位同學的身高,計算...