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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OJ1306-最长公共子上升序列【dp】

發布時間:2023/12/3 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OJ1306-最长公共子上升序列【dp】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

這是一道比較久之前的題了,之前沒做完。不過這次不是因為我改了,而是數據改了(可能之前有問題),然后偶然今天翻的時候就發現自己對了QAQ。


題目

OJ1306
就是給出兩個序列,求出這兩個序列中公共的最長的子上升序列。


解題思路

這里用的是比較慢的方法。就是4重循環。


代碼

#include<cstdio> #include<iostream> #include<cstring> using namespace std; int b[501][501],b2[501][501],f[501][501],a1[501],a2[501],max1,max2,m1,m2; bool ok[501][501]; void print(int x,int y) {if (b[x][y]==0 && b2[x][y]==0 || x<=0 || y<=0) {printf("%d ",a1[x]);return;}print(x-b[x][y],y-b2[x][y]);printf("%d ",a1[x]); }//輸出序列 int main() {scanf("%d",&m1);for (int i=1;i<=m1;i++) scanf("%d",&a1[i]);scanf("%d",&m2);for (int i=1;i<=m2;i++) scanf("%d",&a2[i]); //輸入for (int i=1;i<=m1;i++)//枚舉第一個序列開頭{for (int j=1;j<=m2;j++)//枚舉第二個開頭{f[i][j]=1;//改變if (f[i][j]<f[i-1][j]){f[i][j]=f[i-1][j];b[i][j]=1;b2[i][j]=0;}//判斷路徑輸出if (f[i][j]<f[i][j-1]){f[i][j]=f[i][j+1];b[i][j]=0;b2[i][j]=1;}//判斷路徑輸出if (a1[i]==a2[j])//開頭相同{for (int k=1;k<i;k++)for (int k2=1;k2<j;k2++)//往下枚舉{if (f[i][j]<=f[i-k][j-k2]+1 && a1[i]>a1[i-k] && a1[i-k]==a2[j-k2]){f[i][j]=f[i-k][j-k2]+1;//動態轉移b[i][j]=k;b2[i][j]=k2;//記錄過程}}if (f[max1][max2]<f[i][j]) {max1=i;max2=j;}//改變最大值}else {ok[i][j]=true;}//輸出防止輸出沒有的數}}printf("%d\n",f[max1][max2]);if (f[max1][max2]!=0){print(max1,max2);} }

總結

以上是生活随笔為你收集整理的OJ1306-最长公共子上升序列【dp】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。