題意:用最少的不可交線段覆蓋整個區間,求該最小值
課上摸魚的時候沒注意到題意的轉換,寫了沒啥卵用的回文中心最長列舉,所以**裡的st和h/h2是幾乎沒用的
注意狀態轉移的時候不要只用最長線段去轉移,這樣未必最優(雖然沒找出反例但是用st陣列wa了一發)
#include#include#include#include#include#include#include#include#include#include#include#include#define rep(i,j,k) for(register int i=j;i<=k;i++)
#define rrep(i,j,k) for(register int i=j;i>=k;i--)
#define erep(i,u) for(register int i=head[u];~i;i=nxt[i])
#define iin(a) scanf("%d",&a)
#define lin(a) scanf("%lld",&a)
#define din(a) scanf("%lf",&a)
#define s0(a) scanf("%s",a)
#define s1(a) scanf("%s",a+1)
#define print(a) printf("%lld",(ll)a)
#define enter putchar('\n')
#define blank putchar(' ')
#define println(a) printf("%lld\n",(ll)a)
#define ios ios::sync_with_stdio(0)
using namespace std;
const int maxn = 1e4+11;
const int oo = 0x3f3f3f3f;
const double eps = 1e-7;
typedef long long ll;
ll read()
while(ch>='0'&&ch<='9')
return x*f;
}char str[maxn];
int h[maxn],h2[maxn],st[maxn],dp[maxn];
bool ok[1111][1111];
int main()
while(ch>='0'&&ch<='9')
return x*f;
}char str[maxn];
int h[maxn],h2[maxn],st[maxn],dp[maxn];
int main()else}}
memset(dp,0x3f,sizeof dp);
// rep(i,1,n) cout
rep(i,2,n)
}} println(dp[n]);
} return 0;
}
uva11584 劃分成回文串 線性dp
狀態轉移時,常常需要遍歷之前的每一種情況來看哪一種情況是最優,比如跳過哪乙個串。判斷回文串可以從中心位置開始遍歷,預處理往往會加快時間。include include include using namespace std const int maxn 1000 5 int n,kase,vis m...
UVa 11584 劃分回文串 簡單dp
題意 給乙個字串,要求把它分割成若干個子串,使得每個子串都是回文串。問最少可以分割成多少個。分析 d i 表示以i結尾的串最少可以分割的串數。d i min 這題還是很簡單的,不過值得學習的地方是預處理 i,j 是否為回文串那部分,給出了兩種預處理方法。include include include...
uva11584 劃分回文串 簡單dp
題目大意 給乙個字串,要求把它分割成若干個子串,使得每個子串都是回文串。問最少可以分割成多少個。分析 d i 表示狀態 長度為i的字串的最少劃分回文串 d i 最大為i 1.第i個字元不能與之前的字元形成回文串,d i d i 1 1 2.如果可以,j i 是回文串 d i d j 1 1 如果有多...