首先,我只想声明一点,这道题有毒。。。我用char读入就错了,然而换成string读入就对了或者可以把定义char的数组开的大一点,原先1A的一题硬是纠结了老半天。
传送门:zjnu
题意:
就是对于一个组成的序列,添加尽量少的括号得到一个规则序列,并且输出这个序列的长度。
不过我学到了两种定义dp状态的方法:
1)定义dp[i][j]为i~j中需要添加的最少的括号数。这里我们记录s为一段字符的开始位置,e为一段字符的结束位置。
①当(a[s]=='('&&a[e]==')')||(a[s]=='['&&a[e]==']')时,dp[s][e]=min(dp[s][e],dp[s+1][e-1]);
②当(a[s]=='('&&a[e]!=')')||(a[s]=='['&&a[e]!=']')时,dp[s][e]=min(dp[s][e],dp[s][e-1]+1);
③当(a[e]==')'&&a[s]!='(')||(a[e]==']'&&a[s]!='[')时,dp[s][e]=min(dp[s][e],dp[s+1][e]+1);
④然后当两个数中间还有其他数存在的时候,那么我们就用for,像石子归并那样,然后去更新dp[s][e]
最后输出的时候只要输出dp[0][len-1]+len就好了。
#include<stdio.h>
#include<string.h>