OJ1306-最长公共子上升序列【dp】
生活随笔
收集整理的這篇文章主要介紹了
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】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 蓬头稚子学垂纶的意思 蓬头稚子学垂纶原文
- 下一篇: 碳酸氢钠受热分解化学方程式 碳酸氢钠受热