求讓乙個字串變為回文串所需最少插入字元數
定義狀態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。輸出格式 乙個數,繩子的...