P1799 數列 NOI導刊2010提高(06)

2022-08-13 01:36:21 字數 741 閱讀 4486

這道題就是求通過刪除數字得到乙個新序列,從而與(1, 2, 3, 4, ...)序列所能形成最多的匹配。

在題解翻到了兩種做法:

傳統dp

設\(dp[i][j]\)為從原序列中的前\(i\)位取\(j\)個數所能形成的最多匹配。

注意:匹配的條件是\(a[i]==j\),因為我們求的是新序列,新序列中第\(j\)位所期望的數字就是\(j\)。

如果成立,那麼在\(dp[i - 1][j -1] + 1\),\(dp[i - 1][j]\)中取最大值。

不成立的話,那麼在\(dp[i - 1][j - 1]\),\(dp[i - 1][j]\)中取最大值。

轉化為lcs

其實適當地總結題意(翻題解),也許思路就出現了。

可以與(1, 2, 3, 4, ...)這個序列pk最長公共長度。

把不是的都刪去,最後剩下的其實就是公共的了。

**:

#include#includeconst int maxn = 10005;

int dp[maxn][maxn];

int a[maxn];

int n;

int main()

}int ans = 0;

for(int i = 1; i <= n; i++) ans = std::max(ans, dp[n][i]);

printf("%d\n", ans);

return 0;

}

一本通 P1799 數列

f 0 f 1 f 2 f 3 f 4 f 5 f 6 f 7 f 8 f 9 f 00 021032 84198 438932 1936 我們發現 f i 2f i 1 i 2 我們可以設 g i i i 1 則 g i i i 1 i 1 i 2 2 i 1 g 2 i 1 則 我們可以推出初始...

P1806 跑步 NOI導刊2010普及(11)

水一篇部落格 翻譯 輸入一整數 n 將其拆為若干個正整數之和,且這些數單調遞增 乙個數可不行 直接 dp 易知 數的和為 i 最後數為 j 的方案數,應該是刨除 j 將所有最後數 k 都試一遍的和 k j 即 dp i j dp i j k k j 所以有程式 includeusing namesp...

洛谷 P839 NOI導刊 數頁碼

題面 一道找規律好題.首先,我們肯定只能一位一位的統計答案,考慮從高位向低位統計,顯然這樣要方便的多.對於第i位,我們統計從 a i 1 10 i 0 到 a i 1 10 i a i 10 1 對答案的貢獻.a i 表示原數的第i位 顯然0 10 i 1 1中的每乙個數都是作為上述某個數的一部分出...