Codeforces_607B:Zuma(区间DP)

题目大意给定长度为n的一个序列ai,每次操作可以消除一个回文串,问至少需要几次操作可以将整个序列消除.

解法为区间dp,设f[i][j]表示消除第i至j项所需的最小操作次数,转移的话f[i][j]可以拆分成f[i][k]和f[k+1][j]两段,即相当于分成两段各自消除,而当a[i]==a[j]时,则f[i][j]除了前面的那种消法外,还可以看作在消除了第i+1至j-1个元素后顺带消除了外层的第i个和第j个,这样的话不需要再花费额外的操作次数,但要注意当i+1==j且a[i]==a[j]时需要特殊处理一下,因为这时无论怎样都需要操作一次,具体细节详见程序.

#include
#include
#include
#include
using namespace std;
#define ll long long
const int N=508;
inline int minx(int x,int y){if(x





你可能感兴趣的:(ACM,Wannafly_Union,Codeforces,DP,ACM,Wannafly_Union,Codeforces)