日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

求解最长单调递增子串

發(fā)布時間:2025/3/21 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 求解最长单调递增子串 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

求解最長遞增子串可分為兩種情況,即子串連續(xù)或非連續(xù)。

例如,對于整數(shù)串{1,3,5,1,-1,4,5,3,1,8,3,4,6,2,4,6,7,8,6,4}

其連續(xù)遞增子串為{2,4,6,7,8},非連續(xù)遞增子串為{{-1},{1},{2,4,6,7,8}}

連續(xù)遞增子串的求解思路:

采用動態(tài)規(guī)劃思想,令

lengthOfSubList[k]表示子串{list[0]...list[k]}中最長的連續(xù)遞增子串長度

lengthOfSubListIncludeK[k]表示子串{list[0]...list[k]}中以list[k]結(jié)尾的最長連續(xù)遞增子串長度

indexOfLastElement[k]表示子串{list[0]...list[k]}中最長的連續(xù)遞增子串的最后一個元素的位置

lengthOfSubListIncludeK[k] =

????????? lengthOfSubListIncludeK[k-1]+1,list[k]>=list[k-1]

????????? 1,????????????????????????????? list[k]<list[k-1]

lengthOfSubList[k] = max(lengthOfSubListIncludeK[k],lengthOfSubList[k-1])

indexOfLastElement[k] =

??????? k,????????????????????? lengthOfSubListIncludeK[k]>lengthOfSubList[k-1]

??????? indexOfLastElement[k-1],lengthOfSubListIncludeK[k]<=lengthOfSubList[k-1]

代碼:

  • #include?<stdlib.h>?
  • #include?<stdio.h>?
  • ?
  • void?MaxIncrementSubList(int?list[],int?length)?
  • {?
  • ????//lengthOfSubList[k]表示子串{list[0]...list[k]}中最長的連續(xù)遞增子串長度?
  • ????//lengthOfSubListIncludeK[k]表示子串{list[0]...list[k]}中以list[k]結(jié)尾的最長連續(xù)遞增子串長度?
  • ????int*?lengthOfSubList?=?(int*)malloc(sizeof(int)*length);?
  • ????int*?lengthOfSubListIncludeK?=?(int*)malloc(sizeof(int)*length);?
  • ????int*?indexOfLastElement?=?(int*)malloc(sizeof(int)*length);?
  • ????int?i;?
  • ????//初始化?
  • ????for?(i=0;i<length;i++)?
  • ????{?
  • ????????lengthOfSubList[i]?=?1;?
  • ????????lengthOfSubListIncludeK[i]?=?1;??
  • ????????indexOfLastElement[i]?=?i;???
  • ????}?
  • ????//按照動態(tài)規(guī)劃思想,計算lengthOfSubList[k]和lengthOfSubListIncludeK[k]?
  • ????for?(i=1;i<length;i++)?
  • ????{?
  • ????????if?(list[i]>=list[i-1])?lengthOfSubListIncludeK[i]?=?lengthOfSubListIncludeK[i-1]+1;?
  • ????????else?lengthOfSubListIncludeK[i]?=?1;?
  • ????????if?(lengthOfSubListIncludeK[i]>lengthOfSubList[i-1])?
  • ????????{?
  • ????????????lengthOfSubList[i]?=?lengthOfSubListIncludeK[i];?
  • ????????????indexOfLastElement[i]?=?i;?
  • ????????}?
  • ????????else?
  • ????????{?
  • ????????????lengthOfSubList[i]?=?lengthOfSubList[i-1];?
  • ????????????indexOfLastElement[i]?=?indexOfLastElement[i-1];?
  • ????????}?
  • ????}?
  • ????//逆序輸出最長連續(xù)遞增子串?
  • ????printf("longest?sub?list?is:\n");?
  • ????int?idx?=?indexOfLastElement[length-1];?
  • ????while?(list[idx]>=list[idx-1])?
  • ????{?
  • ????????printf("[%d]=%d?",idx,list[idx]);?
  • ????????idx--;?
  • ????}?
  • ????printf("[%d]=%d?",idx,list[idx]);?
  • }?
  • ?
  • int?main()?
  • {?
  • ????int?list[20]?=?{1,3,5,1,-1,4,5,3,1,8,3,4,6,2,4,6,7,8,6,4};?
  • ????MaxIncrementSubList(list,20);?
  • ????int?a;?
  • ????scanf("%d",&a);?
  • ????return?0;?
  • }?
  • ?

    非連續(xù)遞增子串的求解思路:

    采用動態(tài)規(guī)劃思想,令

    lengthOfSubList[k]表示子串{list[0]...list[k]}中最長的非連續(xù)遞增子串長度

    lengthOfSubListIncludeK[k]表示子串{list[0]...list[k]}中以list[k]結(jié)尾的最長非連續(xù)遞增子串長度

    indexOfLastElement[k]表示子串{list[0]...list[k]}中最長的非連續(xù)遞增子串的最后一個元素的位置

    lengthOfSubListIncludeK[k] = max(lengthOfSubListIncludeK[i]+1, list[k]>=list[i], i=0..k-1)

    lengthOfSubList[k] = max(lengthOfSubListIncludeK[k],lengthOfSubList[k-1])

    indexOfLastElement[k] =

    ??????? k,????????????????????? lengthOfSubListIncludeK[k]>lengthOfSubList[k-1]

    ??????? indexOfLastElement[k-1],lengthOfSubListIncludeK[k]<=lengthOfSubList[k-1]

    代碼:

  • #include?<stdlib.h>?
  • #include?<stdio.h>?
  • ?
  • void?MaxIncrementSubList(int?list[],int?length)?
  • {?
  • ????//lengthOfSubList[k]表示子串{list[0]...list[k]}中最長的非連續(xù)遞增子串長度??
  • ????//lengthOfSubListIncludeK[k]表示子串{list[0]...list[k]}中以list[k]結(jié)尾的最長非連續(xù)遞增子串長度??
  • ????int*?lengthOfSubList?=?(int*)malloc(sizeof(int)*length);?
  • ????int*?lengthOfSubListIncludeK?=?(int*)malloc(sizeof(int)*length);?
  • ????int*?indexOfLastElement?=?(int*)malloc(sizeof(int)*length);?
  • ????int?i,j,max;?
  • ????//初始化?
  • ????for?(i=0;i<length;i++)?
  • ????{?
  • ????????lengthOfSubList[i]?=?1;?
  • ????????lengthOfSubListIncludeK[i]?=?1;??
  • ????????indexOfLastElement[i]?=?i;???
  • ????}?
  • ????//按照動態(tài)規(guī)劃思想,計算lengthOfSubList[k]和lengthOfSubListIncludeK[k]?
  • ????for?(i=1;i<length;i++)?
  • ????{?
  • ????????max?=?lengthOfSubListIncludeK[i];?
  • ????????for?(j=0;j<i;j++)?
  • ????????{?
  • ????????????if?(list[i]>list[j])?
  • ????????????{?
  • ????????????????lengthOfSubListIncludeK[i]?=?lengthOfSubListIncludeK[j]+1;?
  • ????????????????if?(max<lengthOfSubListIncludeK[i])?max?=?lengthOfSubListIncludeK[i];?
  • ????????????}?
  • ????????}?
  • ????????lengthOfSubListIncludeK[i]?=?max;?
  • ????????if?(lengthOfSubListIncludeK[i]>lengthOfSubList[i-1])?
  • ????????{?
  • ????????????lengthOfSubList[i]?=?lengthOfSubListIncludeK[i];?
  • ????????????indexOfLastElement[i]?=?i;?
  • ????????}?
  • ????????else?
  • ????????{?
  • ????????????lengthOfSubList[i]?=?lengthOfSubList[i-1];?
  • ????????????indexOfLastElement[i]?=?indexOfLastElement[i-1];?
  • ????????}?
  • ????}?
  • ????//逆序輸出最長非連續(xù)遞增子串??
  • ????printf("longest?sub?list?is:\n");?
  • ????int?idx?=?indexOfLastElement[length-1];?
  • ????int?tmp?=?list[idx];?
  • ????for?(i=idx;i>=0;i--)?
  • ????{?
  • ????????if?(list[i]<=tmp)?
  • ????????{?
  • ????????????printf("[%d]=%d?",i,list[i]);?
  • ????????????tmp?=?list[i];?
  • ????????}?
  • ????}?
  • }?
  • ?
  • int?main()?
  • {?
  • ????int?list[20]?=?{1,3,5,1,-1,4,5,3,1,8,3,4,6,2,4,6,7,8,6,4};?
  • ????MaxIncrementSubList(list,20);?
  • ????int?a;?
  • ????scanf("%d",&a);?
  • ????return?0;?
  • }?
  • ?

    ?

    轉(zhuǎn)載于:https://blog.51cto.com/zephiruswt/888847

    總結(jié)

    以上是生活随笔為你收集整理的求解最长单调递增子串的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。