poj3280

dp

View Code
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;

#define maxn 205
#define maxm 2005
#define inf 0x3f3f3f3f

int n, m;
char st[maxm];
int cost[maxn];
int f[maxm][maxm];

void input()
{
    scanf("%d%d", &n, &m);
    scanf("%s", st + 1);
    for (int i = 0; i < n; i++)
    {
        char ch[5];
        int a, b;
        scanf("%s%d%d", ch, &a, &b);
        cost[(int)ch[0]] = min(a, b);
    }
}

int work()
{
    // f[i][j] = min(f[i - 1][j] + cost[i], f[i][j + 1] + cost[j])
    // f[i][j] = f[i - 1][j + 1]
    f[0][m + 1] = 0;
    for (int i = m; i > 0; i--)
        f[0][i] = cost[(int)st[i]] + f[0][i + 1];
    for (int i = 1; i <= m; i++)
        f[i][m + 1] = f[i - 1][m + 1] + cost[(int)st[i]];
    for (int i = 1; i < m; i++)
    {
        for (int j = m; j > i; j--)
        {
            f[i][j] = min(f[i - 1][j] + cost[(int)st[i]], f[i][j + 1]
                    + cost[(int)st[j]]);
            if (st[i] == st[j])
                f[i][j] = min(f[i][j], f[i - 1][j + 1]);
        }
    }
    int ret = inf;
    for (int i = 1; i <= m; i++)
        ret = min(ret, f[i - 1][i + 1]);
    for (int i = 1; i < m; i++)
        ret = min(ret, f[i][i + 1]);
    return ret;
}

int main()
{
    //freopen("t.txt", "r", stdin);
    input();
    printf("%d\n", work());
    return 0;
}
posted @ 2012-07-05 15:51  金海峰  阅读(231)  评论(0编辑  收藏  举报