大意: 給你乙個有向圖,每條邊都有一定的權值,現在讓你從圖中的任意一點出發,每次走的邊的權值必須必上一次的權值大的情況下,問你最多能走幾條邊?
這道題最容易想到的, 就是最長單調遞增子串行;但是在這道題上是超時的。
每次走到邊的權值必須比上一次的大, 所以我們可以先把所有的邊按權值進行從小到大的排序。
在定義狀態 dp【i】 為走到第i條邊經過最多的邊的個數。
g【j】 為走到點j所經過的最多的邊的個數。
則dp【i】 = g【sa[i].from】 + 1; 最後的結果就是dp[i]中的最大值;
這裡還有乙個要注意的點就是相等權值邊只能走一次,所以g陣列就不能每條邊的更新了, 而是把具有相同權值的邊都dp【i】都更新完了, 再回來更新具有相等權值的g【j】點的值。為什麼這樣呢,大家可以想一下第一組樣例就明白了。如果進行延遲更新的話,一組樣例就會輸出3, 就相當於同一權值的邊走了多次, 就與題意不符了。
#include#include#includeusing namespace std;
const int maxn = 100000 + 10;
struct info
sa[maxn];
int cmp(info a, info b)
int dp[maxn], g[maxn];
int main()
ans = max(ans, dp[i]);
}printf("%d\n", ans);
}return 0;
}
DP 水題小結
note 雖然叫做水題,但其實也不簡單。1.jzoj 5220 c 一道兩個字串的dp。這樣的題,一般是o n2 的時間複雜度。它的階段一般是兩個串取前i,j個字元的答案,時常還需要根據題意加一些附加的狀態。這種問題的決策往往也很簡單 決策很簡單不代表很好想到轉移 一般的思路是從a i b j 和a...
NYOJ 算菜價(水題)
題目描述 媽媽每天都要出去買菜,但是回來後,兜裡的錢也懶得數一數,到底花了多少錢真是一筆糊塗帳。現在好了,作為好兒子 女兒 的你可以給她用程式算一下了,呵呵。輸入輸入含有一些資料組,每組資料報括菜種 字串 數量 計量單位不論,一律為double型數 和單價 double型數,表示人民幣元數 因此,每...
水題系列 2
水題系列 prev 40 k倍區間 思路 這一題其實不算水題,是一題很巧妙的智商題,要想的到思路,其實題目要求就是要求區間和有幾個能被乙個數整除,但是題目的範圍特別大,兩個for迴圈必超時,所以得用巧方法,先求出字首和,然後將每乙個字首和對需要整除的數取餘,如果有兩個字首和對取餘的結果是一樣的,那麼...