NOIP2010 提高組 烏龜棋 (線性dp

2022-06-05 17:00:28 字數 2271 閱讀 6515

小明過生日的時候,爸爸送給他一副烏龜棋當作禮物。

烏龜棋的棋盤只有一行,該行有 n 個格仔,每個格仔上乙個分數(非負整數)。

棋盤第 1 格是唯一的起點,第 n 格是終點,遊戲要求玩家控制乙個烏龜棋子從起點出發走到終點。

烏龜棋中共有 m 張爬行卡片,分成 4 種不同的型別(m 張卡片中不一定包含所有 4 種型別的卡片),每種型別的卡片上分別標有1、2、3、4 四個數字之一,表示使用這種卡片後,烏龜棋子將向前爬行相應的格仔數。

遊戲中,玩家每次需要從所有的爬行卡片中選擇一張之前沒有使用過的爬行卡片,控制烏龜棋子前進相應的格仔數,每張卡片只能使用一次。

遊戲中,烏龜棋子自動獲得起點格仔的分數,並且在後續的爬行中每到達乙個格仔,就得到該格仔相應的分數。

玩家最終遊戲得分就是烏龜棋子從起點到終點過程中到過的所有格仔的分數總和。

很明顯,用不同的爬行卡片使用順序會使得最終遊戲的得分不同,小明想要找到一種卡片使用順序使得最終遊戲得分最多。

現在,告訴你棋盤上每個格仔的分數和所有的爬行卡片,你能告訴小明,他最多能得到多少分嗎?

\(1≤n≤350,1≤m≤120,0≤a_i≤100,1≤b_i≤4,\)

一開始想的\(5\)維的\(dp\),\(dp[i][j][k][x][y]\)表示走前\(i\)個一共用了\(j\)個數字為\(1\)的卡片,\(k\)個數字為\(2\)的卡片,\(x\)個數字為\(3\)的卡片,\(y\)個數字為\(4\)的卡片所得到得最大分數。

注意到\(dp[i]\)只會由\(dp[i-4],dp[i-3],dp[i-2],dp[i-1]\)轉移而來,所以可以考慮滾動陣列,空間複雜度為\(4*40*40*40*40=10240000\),勉強開得下,但是時間會炸,時間複雜度為\(o(40^4*n)\),於是此方法行不通,gg。

考慮\(dp[i][j][k][z]\)表示一共用了\(i\)個數字為\(1\)的卡片,\(j\)個數字為\(2\)的卡片,\(k\)個數字為\(3\)的卡片,\(z\)個數字為\(4\)的卡片所得到得最大分數。

則\(dp[i][j][k][z]=max(dp[i-1][j][k][z],dp[i][j-1][k][z],dp[i][j][k-1][z],dp[i][j][k][z-1])+a[i+j*2+k*3+z*4]\)

將\(a\)陣列從\(0\)開始輸入,方便處理,再注意一下邊界,最後答案為\(dp[cnt[1][cnt[2]][cnt[3]][cnt[4]]+a[0]\)。

時間複雜度為:\(o(40^4*n)\)

空間複雜度為:\(o(40^4*n)\)

#include #include #include #include #include #include #include #include #include #include#define debug(x) cout<<#x<<" :"<=a;i--)

#define pb push_back

#define all(x) (x).begin(),(x).end()

#define fi first

#define eps 1e-6

#define sz(x) ((int)(x).size())

typedef vectorvi;

typedef long long ll;

typedef pairpii;

const ll mod=1e4+7;

ll powmod(ll a,ll b,ll mod1) return res;}

const int maxn=2e5+10;

const int maxn=2e5+10;

ll q[maxn];

ll n,m;

ll qpow(ll a,ll b)

return ans;}/*

dp[i,j,k,z]=dp[i-1,j,k,z]+a[i+j*2+k*3+z*4]... */

ll a[maxn],b[maxn];

ll dp[41][41][41][41];

ll cnt[maxn];

int main()

if(n==1)

rep(i,0,cnt[1])

if(j)

if(k)

if(z)}}

}}

ll maxx=0;

maxx=max(maxx,dp[cnt[1]][cnt[2]][cnt[3]][cnt[4]]);

cout<}

return 0;}/*

9 56 10 14 2 8 8 18 5 17

1 3 1 2 1

73 */

NOIP2010提高組 烏龜棋

這題一眼dp,本來是設五維的 但是,咳咳,空超了!如何?我們在仔細地看一看dp陣列 我們可以發現,因為,當我們確定了剩下的卡片,我們就能確定了它當前所在的位置是 所以,我們可以直接將i去掉,perfect!那這樣的話,我們只要設四維就可以了。include define max x,y x xusi...

NOIP提高組2010 烏龜棋

題目 題目描述 為了準備乙個獨特的頒獎典禮,組織者在會場的一片矩形區域 可看做是平面直角座標系的第一象限 鋪上一些矩形地毯。一共有 n 張地毯,編號從 1 到n 現在將這些地毯按照編號從小到大的順序平行於座標軸先後鋪設,後鋪的地毯覆蓋在前面已經鋪好的地毯之上。地毯鋪設完成後,組織者想知道覆蓋地面某個...

NOIP2010提高組T2 烏龜棋

題目背景 小明過生日的時候,爸爸送給他一副烏龜棋當作禮物。題目描述 烏龜棋的棋盤是一行n個格仔,每個格仔上乙個分數 非負整數 棋盤第1格是唯一的起點,第n格是終點,遊戲要求玩家控制乙個烏龜棋子從起點出發走到終點。烏龜棋中m張爬行卡片,分成4種不同的型別 m張卡片中不一定包含所有4種型別的卡片,見樣例...