【面试】一系列 动态规划

来源:互联网 发布:整容软件 编辑:程序博客网 时间:2024/05/18 10:37

一. 最大子序列(连续)如,5, -9, 4, 3   (结果为7)

for (int i=0; i<n; i++) {    current += a[i];    if (current > res) res = current;    if (current < 0)  current = 0;    return res;}

二. 最长递增子序列(不连续) 

temp(j)以第J个元素结尾点递增字串长度temp(j) = max(temp(i), i<j && a[i]<a[j]) + 1temp[0] = 1;for (int i=1; i<n; i++) {    temp[i] = 1;    for (int j=0; j<i; j++) {         if (a[i] > a[j])               temp[i] = max(temp[j], temp[i] + 1)    】     maxLen = max(maxLen, temp[i]);     return maxLen;}

三. 求两个字符串的最长的连续公共子串

#include <stdio.h>  #include <stdlib.h>  #include <string.h>  //求公共子串(连续),注意跟求公共子序列有区别  int lcstr( const char* s1,const char* s2)  {  //clen保存公共子串的最大长度,s1_Mindex保存 s1公共子串的最后一个元素的位置  int len1,len2,i,k,cLen=1,s1_Mindex=0;            int **c;   if(s1==NULL || s2==NULL) return -1;    len1=strlen(s1);    len2=strlen(s2);   if(len1< 1 || len2 < 1) return -1;    c=malloc(sizeof(int*)*len1);    for(i=0;i<len1;i++)  {   c[i]=(int *)malloc(len2*sizeof(int));    memset(c[i],0,len2*sizeof(int));    }                                                          /**********init end!*************/      for(i=0;i<len1;i++)    {    for(k=0;k<len2;k++)    {    if(i==0 || k==0)    {    if(s1[i]==s2[k]) c[i][k]=1;    else c[i][k]=0;    }   else    {    if (s1[i] == s2[k])    {    c[i][k] = c[i - 1][k - 1] + 1;    if (cLen < c[i][k])    {    cLen = c[i][k];   s1_Mindex = i;  }    }    }  }    }                                                                                         \  // printf the one of lcs 只是其中一条,如果存在多条。    for(i=0;i<cLen;i++)   {    printf("%c",*(s1+s1_Mindex-cLen+1+i));    }   /*****free array*************/    for(i=0;i<len1;i++)    free(c[i]);    free(c);      return cLen; }  int main(void) {  char a[]="abcgooglecba";  char b[]="cbagoogleABVC";  printf("\nlcstr = %d\n",lcstr(a,b));  return 0;  }

http://www.cnblogs.com/xwdreamer/archive/2011/06/21/2296995.html

0 0
原创粉丝点击