生活随笔
收集整理的這篇文章主要介紹了
[HIHO1323]回文字符串(区间dp)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:http://hihocoder.com/problemset/problem/1323
思路:區間dp,按照區間長度枚舉所有區間和區間的起始位置。這時也可獲取到區間的末位,比對這兩個字符是否相同,如果相同可以更新dp(i,j)=max(dp(i+1,j-1), dp(i,j))。否則,更新三種操作:
dp(i,j)=min(dp(i+1,j),dp(i,j-1),dp(i+1,j-1))+1
1 /*
2 ━━━━━┒ギリギリ♂ eye!
3 ┓┏┓┏┓┃キリキリ♂ mind!
4 ┛┗┛┗┛┃\○/
5 ┓┏┓┏┓┃ /
6 ┛┗┛┗┛┃ノ)
7 ┓┏┓┏┓┃
8 ┛┗┛┗┛┃
9 ┓┏┓┏┓┃
10 ┛┗┛┗┛┃
11 ┓┏┓┏┓┃
12 ┛┗┛┗┛┃
13 ┓┏┓┏┓┃
14 ┃┃┃┃┃┃
15 ┻┻┻┻┻┻
16 */
17 #include <algorithm>
18 #include <iostream>
19 #include <iomanip>
20 #include <cstring>
21 #include <climits>
22 #include <complex>
23 #include <fstream>
24 #include <cassert>
25 #include <cstdio>
26 #include <bitset>
27 #include <vector>
28 #include <deque>
29 #include <queue>
30 #include <stack>
31 #include <ctime>
32 #include <
set>
33 #include <map>
34 #include <cmath>
35 using namespace std;
36 #define fr first
37 #define sc second
38 #define cl clear
39 #define BUG puts("here!!!")
40 #define W(a) while(a--)
41 #define pb(a) push_back(a)
42 #define Rint(a) scanf("%d", &a)
43 #define Rll(a) scanf("%lld", &a)
44 #define Rs(a) scanf("%s", a)
45 #define Cin(a) cin >> a
46 #define FRead() freopen("in", "r", stdin)
47 #define FWrite() freopen("out", "w", stdout)
48 #define Rep(i, len) for(int i = 0; i < (len); i++)
49 #define For(i, a, len) for(int i = (a); i < (len); i++)
50 #define Cls(a) memset((a), 0, sizeof(a))
51 #define Clr(a, x) memset((a), (x), sizeof(a))
52 #define Full(a) memset((a), 0x7f7f7f, sizeof(a))
53 #define lrt rt << 1
54 #define rrt rt << 1 | 1
55 #define pi 3.14159265359
56 #define RT return
57 #define lowbit(x) x & (-x)
58 #define onenum(x) __builtin_popcount(x)
59 typedef
long long LL;
60 typedef
long double LD;
61 typedef unsigned
long long ULL;
62 typedef pair<
int,
int>
pii;
63 typedef pair<
string,
int>
psi;
64 typedef pair<LL, LL>
pll;
65 typedef map<
string,
int>
msi;
66 typedef vector<
int>
vi;
67 typedef vector<LL>
vl;
68 typedef vector<vl>
vvl;
69 typedef vector<
bool>
vb;
70
71 const int maxn =
110;
72
73 int dp[maxn][maxn];
74 char s[maxn];
75 int n;
76
77 int main() {
78 // FRead();
79 while(~Rs(s+
1)) {
80 n = strlen(s+
1);
81 Cls(dp);
82 For(k,
1, n+
1) {
83 For(i,
1, n-k+
1) {
84 int j = i +
k;
85 dp[i][j] =
n;
86 if(s[i] == s[j]) dp[i][j] = min(dp[i][j], dp[i+
1][j-
1]);
87 dp[i][j] = min(dp[i+
1][j]+
1, dp[i][j]);
88 dp[i][j] = min(dp[i][j-
1]+
1, dp[i][j]);
89 dp[i][j] = min(dp[i+
1][j-
1]+
1, dp[i][j]);
90 }
91 }
92 printf(
"%d\n", dp[
1][n]);
93 }
94 RT
0;
95 }
?
轉載于:https://www.cnblogs.com/kirai/p/5632737.html
總結
以上是生活随笔為你收集整理的[HIHO1323]回文字符串(区间dp)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。