码迷,mamicode.com
首页 > 其他好文 > 详细

UVA - 10559 Blocks 和 Vasya and Binary String CodeForces - 1107E (dp OR 记忆化搜索)

时间:2019-07-07 17:19:30      阅读:100      评论:0      收藏:0      [点我收藏+]

标签:style   max   搜索   for   open   code   closed   and   class   

UVA - 10559 Blocks

题意:消消乐,每次连续相同的可以消除,分数加上长度的平方,问最多可以获得几分全部消完

题解:

区间dp + 记忆化搜索

dp[i][j][k] : (区间 [i,  j] 后面带上一段和 j 颜色相同的且长度为 k )的消消乐最大积分

1.消最后一段颜色和 j 颜色相同的

dp[i][j][k] <-- dp[i][j-1][0] + (k+1)^2

2.对于i <= l < j, 如果 l 和 j 的颜色相同, 那么可以把 [l+1, j-1]消掉, 那么剩下的一段就有 k+1 个和 l 相同的一段了

dp[i][j][k] <-- dp[i][l][k+1] + dp[l+1][j-1][0]

 

答案就是dp[1][n][0],采用记忆化搜索更方便转移

技术图片
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<vector>
#include<string.h>
using namespace std;
#define ll long long
#define mem(a, b) memset(a, b, sizeof(a))
const int maxn = 1e6 + 10;
const int INF = 0x3f3f3f3f;

const int N = 205;
int dp[N][N][N];
int a[N];
int dfs(int l, int r, int k) {
    if(l > r) return 0;
    if(l == r) return (k+1)*(k+1);
    if(dp[l][r][k] > 0) return dp[l][r][k];
    dp[l][r][k] = dfs(l, r-1, 0) + (k+1)*(k+1);
    for (int i = l; i < r; i++) {
        if(a[i] == a[r]) {
            dp[l][r][k] = max(dp[l][r][k], dfs(l, i, k+1) +  dfs(i+1, r-1, 0));
        }
    }
    return dp[l][r][k];
}
int main() {
    int T, n;
    scanf("%d", &T);
    for(int cs = 1; cs <= T; cs++) {
        scanf("%d", &n);
        for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
        mem(dp, -1);
        printf("Case %d: %d\n", cs, dfs(1, n, 0));
    }
    return 0;
}
View Code

 

Vasya and Binary String CodeForces - 1107E

题意:连续消除一定的相同的可以获得题目所给你的分数,问消除完所有的字符串之后可以获得的最大分数

题解:和上一题类似,可以使用上一题的转移方程,稍微改一下就好了

技术图片
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<vector>
#include<string.h>
using namespace std;
#define ll long long
#define mem(a, b) memset(a, b, sizeof(a))
const int maxn = 1e2 + 10;
const int INF = 0x3f3f3f3f;

ll dp[maxn][maxn][maxn];
string s;
int a[maxn];

ll dfs(int l,int r,int k)
{
    if(l > r) return 0;
    if(l == r) return a[k + 1];
    if(dp[l][r][k] > 0) return dp[l][r][k];
    dp[l][r][k] = dfs(l,r - 1,0) + a[k + 1];
    for(int i = l; i < r; i++)
    {
        if(s[i] == s[r])
        {
            dp[l][r][k] = max(dp[l][r][k],dfs(l,i,k + 1) + dfs(i + 1,r - 1,0));
        }
    }
    return dp[l][r][k];
}
int main()
{
    int n;
    scanf("%d",&n);
    cin >> s;
    for(int i = 1; i <= n; i++)
        scanf("%d",&a[i]);
    memset(dp,-1,sizeof dp);
    //dfs(0,n - 1,0);
    cout << dfs(0,n - 1,0) <<endl;
}
View Code

 

UVA - 10559 Blocks 和 Vasya and Binary String CodeForces - 1107E (dp OR 记忆化搜索)

标签:style   max   搜索   for   open   code   closed   and   class   

原文地址:https://www.cnblogs.com/smallhester/p/11146790.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!