不熟练的原因是理解的不够深……
#include <stdio.h>
#include <string.h>
#define MAX(a, b) ((a)>(b)?(a):(b))
int num[100] = {-1, 2, 5, -4, 3, 0, -1, 3, 6, -10};
int n = 10;
int func1(){
int i;
int max = 0x80000000, sum = 0;
for(i=0; i<n; i++){
sum += num[i];
if(sum>max) max = sum;
if(sum<0) sum = 0;
}
return max;
}
int func2(){
int i;
int dp[100];
int max;
memset(dp, 0x80, sizeof(dp));
max = dp[0] = num[0];
for(i=1; i<n; i++){
dp[i] = MAX(num[i], dp[i-1]+num[i]);
if(dp[i]>max)
max = dp[i];
}
return max;
}
int main() {
printf("%d\n%d\n", func1(), func2());
return 0;
}
最长连续字串
#include <stdio.h>
#include <string.h>
#define MAX(a, b) ((a)>(b)?(a):(b))
int num[100] = {-1, 2, 5, -4, 3, -2, 0, 3, 6, -10};
int n = 10;
/*连续*/
void func1(){
int i;
int dp[100];
int max;
int s, e;
max = dp[0] = 1;
for(i=1; i<n; i++){
if(num[i]>num[i-1]){
dp[i] = dp[i-1] +1;
if(dp[i]>max){
max = dp[i];
e = i;
}
}else
dp[i] = 1;
}
printf("start:%d end:%d length:%d\n", e-max+1, e, max);
}
/*不连续*/
void func2(){
int i, j;
int dp[100];
int max = 1;
for(i=0; i<n; i++){
dp[i] = 1;
for(j=i-1; j>=0; j--)
if(num[j]<num[i] && dp[j]+1>dp[i]){
dp[i] = dp[j]+1;
if(dp[i]>max)
max = dp[i];
}
}
printf("Max:%d\n", max);
}
/*不连续,这个算法可以同时将长度从1~max的算出来,但只保留了最后一个元素,时间复杂度比上一个小*/
void func3(){
int st[100], top=0;
int i, s, e, m;
for(i=0; i<n; i++){
s = 0; e = top-1;
while(s<=e){
m = (s+e)>>1;
if(num[i]>num[st[m]])
s = m+1;
else
e = m-1;
}
if(s==top) top++;
st[s] = i;
}
for(i=0; i<top; i++)
printf("%d:%d ", i+1, st[i]);
printf("Max:%d\n", top);
}
int main() {
func1();
func2();
func3();
return 0;
}