這道題就是求通過刪除數字得到乙個新序列,從而與(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中的每乙個數都是作為上述某個數的一部分出...