最長遞增子串行 合唱隊形 山峰數列

2021-06-22 23:05:04 字數 1617 閱讀 2716

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位同學的身高,計算...