1. 程式人生 > >Atcoder Yet Another Palindrome Partitioning(狀壓dp)

Atcoder Yet Another Palindrome Partitioning(狀壓dp)

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>
using
namespace 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)