萌新求助区间 dp

CF1132F Clear the String

~~区间DP为什么不用记忆化搜索的写法呢~~ 我总觉得这样写会漏情况或多情况,用记忆华搜索的写法更容易debug
by AsunderSquall @ 2020-10-17 08:57:03


@[我知道了王子](/user/70132) ~~我是为了复习区间 dp 才用区间 dp 做的这题啊~~ 我漏了哪些情况或者多了哪些情况啊 qwq
by 一只书虫仔 @ 2020-10-17 08:59:23


@[一只书虫仔](/user/114914) 感觉写反了?相等不加1吧(错了轻喷)
by zhanghzqwq @ 2020-10-17 09:07:38


@[zhanghanzhang](/user/219668) 改过来都输出 $n$
by 一只书虫仔 @ 2020-10-17 09:08:39


@[一只书虫仔](/user/114914) 诶?我也是输出n啊
by zhanghzqwq @ 2020-10-17 09:11:24


递推公式真的对吗(感觉好像有问题) 为什么$s_i=s_k$则可以以$dp(i,k)+dp(k+1,j)+1$的代价更新? 感觉比较$s_i$和$s_k$没什么意义啊
by jerrywcy @ 2020-10-17 09:11:27


@[一只书虫仔](/user/114914) 相等不加1,且状态转移的`j`改为`j-1`
by shenmadongdong @ 2020-10-17 09:12:46


@[jerrywcy](/user/21878) 相同代表可以删除啊 如果不对的话我再想想
by 一只书虫仔 @ 2020-10-17 09:12:57


我错了 但我感觉应该是两个改过来
by jerrywcy @ 2020-10-17 09:13:37


@[shenmadongdong](/user/71491) 感谢,但是只对了前 4 个,WA 了 ```cpp #include <bits/stdc++.h> using namespace std; int dp[1001][1001]; int main () { int n; char s[505]; scanf("%d", &n); scanf("%s", s); for (int len = 0; len < n; len++) for (int i = 0; i < n - len + 1; i++) { int j = i + len; int Min = 0x3f3f3f3f; if (i == j) { dp[i][j] = 1; continue; } for (int k = i; k < j; k++) { if (s[i] == s[k]) Min = min(Min, dp[i][k] + dp[k + 1][j - 1]); else Min = min(Min, dp[i][k] + dp[k + 1][j - 1] + 1); } dp[i][j] = Min; } printf("%d", dp[0][n - 1]); return 0; } ```
by 一只书虫仔 @ 2020-10-17 09:14:15


| 下一页