Atcoder Yet Another Palindrome Partitioning(狀壓dp)
阿新 • • 發佈:2017-11-01
cnblogs pre get 就是 狀壓 條件 class main lan
Atcoder Yet Another Palindrome Partitioning
思路:
一個字符串滿足條件的情況是奇數字母個數小於等於1,也就是異或起來是1<<j(0<=j<=25)
記mark是異或起來的值
狀態轉移:
dp[mark]=dp[mark]+1;
dp[mark]=min(dp[mark^(1<<j)]+1,dp[mark]);(0<=j<=25)
註意dp[0]被轉移後可能會變成1,但是由它轉移的需要dp[0]=0,所以每次記得把dp[0]變為0
代碼:
#include<bits/stdc++.h> usingnamespace std; #define ll long long #define pb push_back #define mem(a,b) memset(a,b,sizeof(a)) const int N=2e5+5; const int INF=0x3f3f3f3f; int dp[(1<<26)+5]; string s; int main() { ios::sync_with_stdio(false); cin.tie(0); cin>>s; mem(dp,INF); dp[0]=0;int mark=0; int ans=0; for(int i=0;i<s.size();i++) { mark^=1<<(s[i]-‘a‘); dp[mark]=dp[mark]+1; for(int j=0;j<26;j++) { dp[mark]=min(dp[mark^(1<<j)]+1,dp[mark]); } ans=dp[mark]; dp[0]=0; } cout<<ans<<endl; return 0; }
Atcoder Yet Another Palindrome Partitioning(狀壓dp)