洛谷 CF607B Zuma(区间dp)
传送门
解题思路
显然是区间dp,判断a[i]是否等于a[j],然后再枚举中间节点k即可。
关键是玄学错误:
一份代码提交后间接性AC?
(就是一会显示AC,一会再提交就WA掉,一会又AC?)
莫非是因为用了班主任名字当变量?
感谢 @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率!!呜呜呜~~~