- 当我穿上这身学士服的时候,依旧不敢相信我即将毕业。因为,这仍然是个启程。
游艾西湖畔
- 拂晓,游艾西湖畔,寻忆,未见拾沙水,但闻落木花。
安卓7.x下重新打包第三方ROM
最近对安卓底层比较更兴趣,打算研究一番ROM的制作与移植,汉化之类技术,苦于这方面的比较有技术的文章比较少,多数还借鉴国外帖子,在工具方面也比较少,没有形成一个好的技术圈。
漂在天空的日子
-
你有没有听说过,这个世界上有一种鸟……
-
听过啦,没脚的那种是嘛!这套哄女孩的可以啊,你像鸟吗?哪一寸像鸟啊?你只不是唐人街垃圾堆里捡回来的酒鬼。像鸟,你那要是会飞的话,会窝在这里么?飞呀,有本事飞给我看看啊!
-
有机会的,不过到时候,你可不要自卑噢。
瑶湖公园
考研日记
这段大学最充实的日子,终于结束。回想起来,花人生的一小段时光去奋斗,升学,提升自己,是很有必要的。 那么,也同样恭喜看到篇帖子的人,也许你也选择了与我同样的道路,不论结果如何,这段日子,也将成为你大学时光最难忘的一刻。 至少,你将会在这个时候,学到:
- 什么叫做坚持,一年如一日的坚持
- 什么叫做认真,不放过任何一个知识点的认真
- 什么叫做态度,对待自己人生前途的态度
动态规划-最长增长子序列
最长递增子序列(LIS)的问题是要找到一个给定序列的最长子序列的长度,使得子序列中的所有元素被排序的顺序增加。
例如,{2,1,0,5,4,8,9} LIS为{2,4,8,9},{2,4,8,9},{1,5,8,9}….最长长度为4。
这里存在一个局部前后无关性的规律:
设 arr[0..m..m+1] 其中arr[0..m] 的最长子序列是包含于arr[0..m+1]的,且长度包含
所以,求arr[0..m]的最长子序列,只需要找出{ arr[0..m-i],其中m=>i>=1}的LIS,
此时,设{ arr[0..m-i],其中m=>i>=1}的最长子序列:i = k;
如果arr[k] < arr[m]的话,则arr[m]的LIS长度为arr[0..k]的LIS长度+1;
LIS = LIS + arr[m];
int arr[10] = {2,1,0,5,4,8,9};
int n = sizeof(arr) / sizeof(arr[0]);
//返回包含第n个元素作为最后一个元素的子序列的最长长度,
//a用于记录最长长度,
int lis(int n, int &a)
{
if(n == 1) return 1;
int cmax = 0;
for(int i = 1; i < n; i++)
{
//第n个元素有可能不是LIS的最后一个元素,所以这里的递归不能放进if里面。
int r = lis(i,a);
if(arr[i-1]<arr[n-1])
{
if(r > cmax) cmax = r;
}
}
a = max(a,cmax+1);
return cmax + 1;
}
可以看到,每次lis(n)的执行都会调用n-1次lis,时间复杂度为O(n^2), 下面进行优化: 方法与之前的背包问题和整分拆分问题非常相似。
int arr[10] = {2,1,0,5,4,8,9};
int nSize = sizeof(arr) / sizeof(arr[0]);
int lis2(int nSize)
{
int *c;
c = (int *) malloc(sizeof(int)*nSize);
c[0] = 1;
int gmax=0;
for(int n = 1; n < nSize; n++ )
{
int cmax = 0;
for ( int i = 0; i < n; i++ )
{
if ( arr[i]<arr[n] && c[i]>cmax )
cmax = c[i];
}
c[n] = cmax + 1;
if ( c[n] > gmax ) gmax = c[n];
}
free( c );
return gmax;
}
整数拆分
将一个整数拆分成2的幂相加,比如
7=1+2+4 |
7=1+2+2+2 |
7=1+1+1+4 |
7=1+1+1+2+2 |
7=1+1+1+1+1+2 |
7=1+1+1+1+1+1+1 |
4 = 4
4 = 2 + 2
4 = 1 + 1 + 2
4 = 1 + 1 + 1 + 1