CODE VS 江哥的DP題b

2021-08-08 23:54:50 字數 1091 閱讀 9382

原題

江哥解題報告:

我們不妨按照江哥dalao的思路來寫:

設f(i,j)表示a中列舉到了第i個,b中列舉到了第j個,則:

-a[i]=b[j] f(i,j)=f(i-1,j-1)+1;//如果相等就可以增加一條線

-a[i]≠b[j] f(i,j)=max;

a1,b1是要幹什麼呢?不妨看一看這張圖

找到當前b[j]所對應的a中b[j]這個數的編號,記為a1

同理,找到當前a[i]在b中的a[i]這個數的編號,記為b1

所以如果他們滿足上圖所對應的可以交叉的規律,就狀態轉移一下,然後…

懂了吧!

#include

#include

#include

#include

#include

#define file(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout)

using

namespace

std;

const

int inf=1000000000+10;

struct nodea[100010];

int f[1010][1010],flag[1010];

int numbera[1010],numberb[1010];

int main()

for(i=1;i<=n;i++)

for(i=1;i<=n;i++)

for(j=1;j<=n;j++)

if(a[i].a==a[j].b)

f[i][j]=f[i-1][j-1]+1;

else

printf("%d\n",f[n][n]);

return

0;}

CODE VS 江哥的DP題a

原題 先來一波江哥的解題報告殺 這種方法十分的高深莫測,所以我們換乙個容易理解的 f i,j 表示前i個選j個,且第i個必選,那麼就是江哥的轉移方程 p.s 但是不會字首和優化!顯然,這樣的方法只能獲得30分,資料十分的坑,那麼優化如下 f i,j,0 表示前i個裡面選j個且第i個不選 f i,j,...

江哥的DP題(B)

題目描述 給定兩個1 n的序列a b,如果ai bj,則能夠在ai bj之間連一條直線,要求每條直線至多與一條直線相交。輸入描述 第一行輸入乙個正整數n 第二行輸入n個正整數,表示序列a的元素 第三行輸入n個正整數,表示序列b的元素。輸出描述 輸出乙個整數,表示最大的合法連線數量。樣例輸入 71 5...

4816 江哥的dp題b

時間限制 1 s 空間限制 256000 kb 題目等級 gold 題解給出兩個1 n的隨機排列a,b。若ai bj,則你可以在ai,bj之間連一條線。要求每條線至多與一條線相交。下圖分別說明了一種合法和不合法的方案。輸入描述 input description 第一行乙個正整數n。接下來一行n個正...