UVA 11584 DP 最少線段覆蓋

2022-05-07 03:39:11 字數 1475 閱讀 1940

題意:用最少的不可交線段覆蓋整個區間,求該最小值

課上摸魚的時候沒注意到題意的轉換,寫了沒啥卵用的回文中心最長列舉,所以**裡的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 如果有多...