nc17137 思路
dp狀態定義為dp[i][j]表示前i個數刪除j個後的答案。那麼很容易得到遞推方程
dp[i]
[j]=dp[i-1]
[j-1
]+dp[i-1]
[j];
就是刪除當前這個和不刪除當前這個的情況,然後如果是 1 2 3 5 6 7 8 5 m=4的話,就會出現刪除5 6 7 8 和刪除6 7 8 5的情況重複的情況,我們需要減去重複的這部分,觀察到重複的這部分需要把6 7 8給刪除,就是把兩個5之間的數全給刪除了,於是重複的這部分就是dp[pos-1][j-(i-pos)]就代表中間的全部給刪除了。
**實現
#include
using
namespace std;
#define ll long long
const
int n =
1e5+10;
int dp[n][15
],pos[15]
;const
int mod =
1e9+7;
intmain()
} pos[x]
=i;}
printf
("%d\n"
,dp[n]
[m]);}
}
每日一題 石子合併 區間DP
區間dp我也不會,哈哈,正好一起學習一下,做一下這道區間dp入門題。區間dp其實也是線性dp的一種,只是由於其實在太規律,所以分成一類以方便學習!要點 狀態必然包含區間是哪個 i,j 通過列舉區間分界點進行轉移。也就是說乙個大區間是由兩個子區間合併來的或者是兩個子區間加上中間元素合併來的!在合併 的...
每日一題 27 過河 (DP 離散化)
演算法涉及 dp 離散化 l 的範圍太大,無法作為陣列下標,所以先離散化,再dp。兩點間的距離d大於t時,一定可以由 d t 跳過來,所以最多隻需要t d t種距離的狀態就可以表示這兩個石子之間的任意距離關係。這樣就把題目中的 10 9 壓縮成了 2 t m 最多不超過 2000 然後就可以放心大膽...
每日一題 1
題目詳情 peter喜歡玩數字遊戲,但數獨這樣的遊戲對他來說太簡單了,於是他準備玩乙個難的遊戲。遊戲規則是在乙個n n的 裡填數,規則 對於每個輸入的n,從左上角開始,總是以對角線為起點,先橫著填,再豎著填。這裡給了一些樣例,請在樣例中找到規律並把這個n n的 列印出來吧。輸入描述 多組測試資料 資...