dp[i][j]表示第i个时,(比)多j个
你可能会想 是不是会出现像 “)))(((”这样的状况
这是不可能的因为这样的话j是负值,而在dp的过程中是不可能出现负值的
AC代码如下:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
#define MAX 0x3f3f3f3f
int dp[1100][1100];
char s[1100];
int num[1100], len;
int main(){
while( scanf( "%s", &s[1] ) != EOF ){
if( s[1] != '(' && s[1] != ')' ){
continue;
}
len = strlen( s + 1 );
for( int i = 1; i <= len; i++ ){
scanf( "%d", &num[i] );
}
if( len % 2 == 1 ){
cout << -1 << endl;
continue;
}
memset( dp, 0x3f, sizeof( dp ) );
dp[0][0] = 0;
for( int i = 1; i <= len; i++ ){
for( int j = 0; j <= i; j++ ){
if( s[i] == '(' ){
if( j > 0 ) dp[i][j] = min( dp[i-1][j-1], dp[i][j] );
dp[i][j] = min( dp[i-1][j+1] + num[i], dp[i][j] );
}else{
if( j > 0 ) dp[i][j] = min( dp[i-1][j-1] + num[i], dp[i][j] );
dp[i][j] = min( dp[i-1][j+1], dp[i][j] );
}
}
}
cout << dp[len][0] << endl;
}
return 0;
}