--------很迷茫不知道该学点什么,好在今天报名了个java游戏方面的比赛,需要前期储备很多要学的知识,算是找到点自己学习的方向
区间dp第一次做啊,找的kuang神的代码看明白了,但是让自己写不出来 ==
题意是把第一个字符串用相同材料把某段区间刷成一种材料就这样用最少刷的次数刷成第二个字符串
思路就是首先假定第一个字符串是个空白区域,让你用最快的方法刷成第二字符串,这步很简单就是把首尾有相同字母的某段区间可以减少一次,用dp[i][j]保存i到j的最优值,然后再来与第一字符串比较对应位置是否相等字符,是的话g[i] = g[i-1];最后再循环j位置找到从0到i的最优解。。最后输出g[ln-1]即答案。。
本题的代码
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <math.h>
using namespace std;
#define MAX 110
int dp[MAX][MAX], g[MAX];
char st1[MAX], st2[MAX];
int main()
{
while (scanf("%s%s", &st1, &st2) == 2)
{
int ln = strlen(st1);
for (int i = 0; i < ln; i++)
for (int j = i; j < ln; j++)
dp[i][j] = j-i+1;
for (int i = ln-2; i >= 0; i--)
for (int j = i+1; j < ln; j++)
{
dp[i][j] = dp[i+1][j]+1;
for (int k = i+1; k <= j; k++)
if (st2[i] == st2[k])
dp[i][j] = min(dp[i][j], dp[i+1][k-1]+dp[k][j]);
}
for (int i = 0; i < ln; i++)
{
g[i] = dp[0][i];
if (st1[i] == st2[i])
{
if (i == 0) g[i] = 0;
else
g[i] = g[i-1];
}
for (int j = 0; j <= i; j++)
g[i] = min(g[i], g[j]+dp[j+1][i]);
}
printf("%d\n", g[ln-1]);
}
return 0;
}