luogu P1070 道路遊戲 DP

2022-08-03 06:24:11 字數 2463 閱讀 1780

[luogu]p1070

道路遊戲

題目描述

小新正在玩乙個簡單的電腦遊戲。

遊戲中有一條環形馬路,馬路上有 n 個機械人工廠,兩個相鄰機械人工廠之間由一小段馬路連線。小新以某個機械人工廠為起點,按順時針順序依次將這 n 個機械人工廠編號為1~n,因為馬路是環形的,所以第 n 個機械人工廠和第 1 個機械人工廠是由一段馬路連線在一起的。小新將連線機械人工廠的這 n 段馬路也編號為 1~n,並規定第 i 段馬路連線第 i 個機械人工廠和第 i+1 個機械人工廠(1≤i≤n-1),第 n 段馬路連線第 n 個機械人工廠和第 1個機械人工廠。

遊戲過程中,每個單位時間內,每段馬路上都會出現一些金幣,金幣的數量會隨著時間發生變化,即不同單位時間內同一段馬路上出現的金幣數量可能是不同的。小新需要機械人的幫助才能收集到馬路上的金幣。所需的機械人必須在機械人工廠用一些金幣來購買,機械人一旦被購買,便會沿著環形馬路按順時針方向一直行走,在每個單位時間內行走一次,即從當前所在的機械人工廠到達相鄰的下乙個機械人工廠,並將經過的馬路上的所有金幣收集給小新,例如,小新在 i(1≤i≤n)號機械人工廠購買了乙個機械人,這個機械人會從 i 號機械人工廠開始,順時針在馬路上行走,第一次行走會經過 i 號馬路,到達 i+1 號機械人工廠(如果 i=n,機械人會到達第 1 個機械人工廠),並將 i 號馬路上的所有金幣收集給小新。 遊戲中,環形馬路上不能同時存在 2 個或者 2 個以上的機械人,並且每個機械人最多能夠在環形馬路上行走 p 次。小新購買機械人的同時,需要給這個機械人設定行走次數,行走次數可以為 1~p 之間的任意整數。當馬路上的機械人行走完規定的次數之後會自動消失,小新必須立刻在任意乙個機械人工廠中購買乙個新的機械人,並給新的機械人設定新的行走次數。

以下是遊戲的一些補充說明:

遊戲從小新第一次購買機械人開始計時。

購買機械人和設定機械人的行走次數是瞬間完成的,不需要花費時間。

購買機械人和機械人行走是兩個獨立的過程,機械人行走時不能購買機械人,購買完機械人並且設定機械人行走次數之後機械人才能行走。

在同乙個機械人工廠購買機械人的花費是相同的,但是在不同機械人工廠購買機械人的花費不一定相同。

購買機械人花費的金幣,在遊戲結束時再從小新收集的金幣中扣除,所以在遊戲過程中小新不用擔心因金幣不足,無法購買機械人而導致遊戲無法進行。也因為如此,遊戲結束後,收集的金幣數量可能為負。

現在已知每段馬路上每個單位時間內出現的金幣數量和在每個機械人工廠購買機械人需要的花費,請你告訴小新,經過 m 個單位時間後,扣除購買機械人的花費,小新最多能收集到多少金幣。

輸入輸出格式

輸入格式:

第一行 3 個正整數,n,m,p,意義如題目所述。

接下來的 n 行,每行有 m 個正整數,每兩個整數之間用乙個空格隔開,其中第 i 行描

述了 i 號馬路上每個單位時間內出現的金幣數量(1≤金幣數量≤100),即第 i 行的第 j(1≤j≤m)個數表示第 j 個單位時間內 i 號馬路上出現的金幣數量。

最後一行,有 n 個整數,每兩個整數之間用乙個空格隔開,其中第 i 個數表示在 i 號機械人工廠購買機械人需要花費的金幣數量(1≤金幣數量≤100)。

輸出格式:

共一行,包含 1 個整數,表示在 m 個單位時間內,扣除購買機械人

花費的金幣之後,小新最多能收集到多少金幣。

輸入輸出樣例

輸入樣例1#:

2 3 2

1 2 3

2 3 4

1 2輸出樣例1#:5說明

【資料範圍】

對於 40%的資料,2≤n≤40,1≤m≤40。

對於 90%的資料,2≤n≤200,1≤m≤200。

對於 100%的資料,2≤n≤1000,1≤m≤1000,1≤p≤m。

noip 2009 普及組 第四題

這道題蒟蒻覺得挺難的。

用f[i][j]表示在第i個時間走到j的最佳收益

轉移需要->f[i-k][j-k]

注意到可以任意選起始點,我們只需要ith的最優即可。

考慮狀態f[i]=min

時間複雜度應該是o(n^3)

可能是資料弱,水過了...

**:

1 #include2 #include3 #include4

using

namespace

std;

5 inline int

read();

6int max(int x,int y)

7namespace

lys32}33

}34 printf("

%d\n

",dp[m]);

35return0;

36}37}

38int

main()

42 inline int

read()

49while(c>='

0'&&c<='

9') kk=kk*10+c-'

0',c=getchar();

50return kk*ff;

51 }

P1070 道路遊戲

小新正在玩乙個簡單的電腦遊戲。遊戲中有一條環形馬路,馬路上有 n 個機械人工廠,兩個相鄰機械人工廠之間由一小段馬路連線。小新以某個機械人工廠為起點,按順時針順序依次將這 n 個機械人工廠編號為1 n,因為馬路是環形的,所以第 n 個機械人工廠和第 1 個機械人工廠是由一段馬路連線在一起的。小新將連線...

Luogu 1070 道路遊戲

看完題面想了一會發現只會寫 n 3 愣了一會才想出了單調佇列優化的做法。90分演算法 設 f 表示第 i 分鐘在第 j 座城市已經走了 k 步的最大價值,轉移顯然,時間複雜度 o n 3 但是我沒有實現它。100分演算法 思考一下最終的答案是怎樣選出來的,我們把矩陣畫出來 發現題目可以轉化為在這個矩...

洛谷P1070 道路遊戲

小新正在玩乙個簡單的電腦遊戲。遊戲中有一條環形馬路,馬路上有 n 個機械人工廠,兩個相鄰機械人工廠之間由一小段馬路連線。小新以某個機械人工廠為起點,按順時針順序依次將這 n 個機械人工廠編號為1 n,因為馬路是環形的,所以第 n 個機械人工廠和第 1 個機械人工廠是由一段馬路連線在一起的。小新將連線...