hrbust - 1828
網上搜不到題解?那我就來寫一篇吧哈哈哈
最優化問題先考慮\(dp\),設\(dp(i)\)表示將前\(i\)個字元(包括\(i\))分割成不相交的回文子串的最小數目
直接模擬題意轉移即可。初始化寫在裡面了,\(dp(i)=i\)
\[dp(i)=\min\
\]其中\(s[j\dots i]\)是乙個回文串,\(o(n^2)\)預處理回文串即可,注意偶回文串和奇回文串。
剛開始想太多,這道題。以後遇最優化的題一定要花有一定量的時間設計dp,因為dp的操作性強,正確性也比較好驗證,即使後面有其他的解法,dp也可以作為對拍的保障。
//@winlere
#include#include#include#includeusing namespace std;
const int maxn=1e2+5;
char c[maxn];
int dp[maxn],in[maxn][maxn],n;
int main()
for(register int t=1;t<=n;++t)
for(register int i=1;i<=t;++i)
if(in[i][t])
dp[t]=min(dp[t],dp[i-1]+1);
printf("%d\n",dp[n]-1);
}return 0;
}
度度熊剪紙條
ps 改了這麼久,對拍一下就找到錯誤了。貪心,首部出現的1,是不用去剪的,所以當作特殊元素考慮,因此當 k 0的時候 或者 k沒有用完的時候一定要考慮是否用到了首部那一節 cntst 而尾部只需要剪一次,中間的部分需要減兩次,貪心的時候要分別討論 有史以來寫得最醜的 inline bool cmp ...
2018百度之星(A)度度熊剪紙條
度度熊有一張紙條和一把剪刀。紙條上依次寫著 n 個數字,數字只可能是 0 或者 1 度度熊想在紙條上剪 k 刀 每一刀只能剪在數字和數字之間 這樣就形成了 k 1 段。他再把這 k 1 段按一定的順序重新拼起來。不同的剪和接的方案,可能會得到不同的結果。度度熊好奇的是,字首 1 的數量最多能是多少。...
hdu6376 度度熊剪紙條
度度熊有一張紙條和一把剪刀。紙條上依次寫著 n 個數字,數字只可能是 0 或者 1。度度熊想在紙條上剪 k 刀 每一刀只能剪在數字和數字之間 這樣就形成了 k 1 段。他再把這 k 1 段按一定的順序重新拼起來。不同的剪和接的方案,可能會得到不同的結果。度度熊好奇的是,字首 1 的數量最多能是多少。...