原題
江哥解題報告:
我們不妨按照江哥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個正...