hdu1513 Palindrome 動態規劃

2021-07-02 15:07:07 字數 1460 閱讀 2938

求讓乙個字串變為回文串所需最少插入字元數

定義狀態dp

[i][

j]表示從左到右i個字元,從右到左j個字元,要讓他們回文需要插入多少字元

顯然,a[i

]==a[

j]時,dp

[i][

j]=d

p[i−

1][j

−1]

a[i]

!=a[

j]時,就需要插入乙個字元,因此dp

[i][

j]=m

in(d

p[i−

1][j

],dp

[i][

j−1]

)+1

題目中字串有5000長度,5000*5000的int陣列,反正我是爆了……

無法把陣列壓縮成一維,因為你必須同時保留dp

[i−1

][j−

1]和dp[

i][j

−1] 來轉移狀態。

那就壓縮成一維*2唄

對於題目最終的答案,應該是mi

n(dp

[i][

n−i]

,dp[

i][n

−i−1

]),因為插入完成後的字串若是奇數個,中間那個字元是可以丟棄的

壓縮了陣列之後,答案盡量邊dp邊更新,不然容易粗事兒……

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define clr(x) memset(x,0,sizeof(x))

#define ll long long

#define eps 1e-6

#define pow2(x) ((x)*(x))

#define forto(i,n) for(int i=0;i#define for1to(i,n) for(int i=1;i<=n;i++)

#define vi vector

using

namespace

std;

const

double pi=acos(-1.0);

#define inf 0x3fffffff ///int_max一半防止上溢

#define ninf 0xbfffffff

using

namespace

std;

char a[5555];

int dp[2][5555];

int main()

}cout

0;}

HDU 1513 LCS 滾動陣列

這題的意思很簡單,就是新增最少的字元是該字串為回文字串,可以用lcs做,比較正序和逆序最長的lcs長度,另外還要使用滾動陣列,要不會mle 還有一點很坑的地方,多組輸入 題目上沒說 include include include include define max 5005 using names...

Vijos 貪心 堆 P1513 緊急救援

按照h排序,然後構造大根堆,將每個t一一插入,那麼這裡有兩種情況 1 當前總時間 堆和 ti hi,這時直接插入並且堆和更新 2 否則,如果根堆頂部的值都比ti大,那麼讓ti替換掉根堆頂部即可 答案是根堆裡元素的個數。include include include include define ms...

P1513 繞釘子的長繩子(C語言)

題目描述 平面上有n個圓柱形的大釘子,半徑都為r,所有釘子組成乙個凸多邊形。現在你要用一條繩子把這些釘子圍起來,繩子直徑忽略不計。求出繩子的長度 輸入格式 第1行兩個數 整數n 1 n 100 和實數r。接下來n行按逆時針順序給出n個釘子中心的座標 座標的絕對值不超過100。輸出格式 乙個數,繩子的...