foj 1880 DP

来源:互联网 发布:大学生网络责任感 编辑:程序博客网 时间:2024/04/20 10:45

dp[i][j]表示第i个时,(比)多j个

你可能会想 是不是会出现像 “)))(((”这样的状况

这是不可能的因为这样的话j是负值,而在dp的过程中是不可能出现负值的

AC代码如下:

#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;#define MAX 0x3f3f3f3fint 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;}


0 0
原创粉丝点击