T4:【NOIP2008TG】傳紙條(message)(二維DP)

前言

這一道題不太難,怎麼表現呢?
告訴你吧,萌新寫的代碼長度25行

直入主題

題目傳送門

首先呢,我在這裏先不直接講最強大的二維DP,
先從四維開始吧:

基礎:

四維DP,時間、空間複雜度都爲 O(n4)

用f[i][j][x][y]表示
第一張紙條傳到(i,j),
第二張紙條傳到(x,y)
它們累計下來的好心程度和。

對於每一步呢,分別有四種情況

1.第一張紙條向下傳,第二張紙條向下傳;
2.第一張紙條向下傳,第二張紙條向右傳;
3.第一張紙條向右傳,第二張紙條向下傳;
4.第一張紙條向右傳,第二張紙條向右傳;

F[i][j]=max(F[i-1][j][x-1][y] ,F[i-1][j][x][y-1] ,F[i][j-1][x-1][y] ,F[i][j-1][x][y-1])+a[i][j]+a[x][y];1

那麼如何判重呢?
其實可以不判,只要你想辦法使它沒有重複的情況就行了,
So for循環時我們限制y<x。

升級

三維DP,時間複雜度O(n3);空間複雜度多一倍;

我們可以發現每一張紙條每一步
要麼只走右邊,
要麼只走下邊,
2
所以i+j=x+y;於是我們DP每一步的情況 3
用i表示第一張紙往下走了多少步,因爲枚舉了k=i+j(就是走了多少步)所以可以用k-i來代替j;
第二張紙也同樣可以用k和x表示出來座標。因爲枚舉的是步數4所以呢,空間纔會多一倍。

於是 F[k][i][x]=max(F[k-1][i][x]+F[k-1][i][x-1]+F[k-1][i-1][x]+F[k-1][i-1][x-1]);

Boss進階:

最強大的二維DP,複雜度和三維一樣,但空間少了很多

如果你對揹包問題掌握得十分嫺熟,你就能用揹包思想來降維。怎麼做到的呢?

我們從三維DP的狀態轉移式中發現它只和上一步有關係,
並只牽扯到x,x-1,沒用到x+1;
所以我們從後向前推,這樣你現在用的二維數組就是上一步的,對x進行覆蓋也不會產生後效性。

Readers:這又如何去重呢?

Reply:其實和四維一樣,你只需要保證 x > i 就行啦,因爲這樣就不會有重複情況出現,自然也就不需要去重啦。

光陰似箭,T4的講解就先告一段落了,師兄們,告辭!

萌新求贊!


  1. 全部反向是因爲要求上一個 ↩︎

  2. 在這兒我們把第二張紙條也從左上往右下移動(反向) ↩︎

  3. 用k表示 ↩︎

  4. n+m-2 ↩︎

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章