洛谷 CF607B Zuma(区间dp)

传送门


解题思路

显然是区间dp,判断a[i]是否等于a[j],然后再枚举中间节点k即可。

关键是玄学错误

一份代码提交后间接性AC?

(就是一会显示AC,一会再提交就WA掉,一会又AC?)

莫非是因为用了班主任名字当变量?

AC记录 WA记录

感谢 @rcxkk 解答并提供hack数据。

32行前的else不能加,否则不能保证正确性。

 16

 1 1 1 2 2 1 1 2 2 1 1 1 2 2 1 1

AC(WA)代码

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cmath>
 4 #include<cstdio>
 5 #include<cstring>
 6 #include<cstdlib>
 7 #include<queue>
 8 #include<set>
 9 #include<map>
10 #include<vector>
11 #include<iomanip>
12 #include<ctime>
13 #include<stack>
14 using namespace std;
15 const int maxn=505;
16 int n,a[maxn],dp[maxn][maxn];
17 int main()
18 {
19     memset(dp,0x3f,sizeof(dp));
20     cin>>n;
21     for(int i=1;i<=n;i++) cin>>a[i];
22     for(int i=1;i<n;i++){
23         dp[i][i]=1;
24         if(a[i]==a[i+1]) dp[i][i+1]=1;
25         else dp[i][i+1]=2;
26     }
27     dp[n][n]=1;
28     for(int i=3;i<=n;i++){
29         for(int j=1;j<=n-i+1;j++){
30             int k=i+j-1;
31             if(a[j]==a[k]) dp[j][k]=dp[j+1][k-1];
32             for(int lxl=j;lxl<k;lxl++){
33                 dp[j][k]=min(dp[j][lxl]+dp[lxl+1][k],dp[j][k]);
34             }
35         }
36     }
37     cout<<dp[1][n];
38     return 0;
39 }

 //辣鸡题目还我睡觉时间!!还我AC率!!呜呜呜~~~

posted @ 2020-10-19 00:23  尹昱钦  阅读(87)  评论(0编辑  收藏  举报