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

Posted smallhester

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVA - 10559 Blocks 和 Vasya and Binary String CodeForces - 1107E (dp OR 记忆化搜索)相关的知识,希望对你有一定的参考价值。

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 记忆化搜索)的主要内容,如果未能解决你的问题,请参考以下文章

Uva10559Blocks(区间DP)

「UVA10559」Blocks

luogu UVA10559 ybtoj 区间DP课堂过关 例题3消除木块 & 方块消除 Blocks

UVa 10559 Blocks - 动态规划

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

UVa 10559 Blocks (DP)