列表

详情


DP39. 字母收集

描述

有一个 的矩形方阵,每个格子上面写了一个小写字母。
小红站在矩形的左上角,她每次可以向右或者向下走,走到某个格子上就可以收集这个格子的字母。
小红非常喜欢 "love" 这四个字母。她拿到一个 l 字母可以得 4 分,拿到一个 o 字母可以得 3 分,拿到一个 v 字母可以得 2 分,拿到一个 e 字母可以得 1 分。
她想知道,在最优的选择一条路径的情况下,她最多能获取多少分?

输入描述


接下来的 行 每行一个长度为 的、仅有小写字母构成的字符串,代表矩形方阵。

输出描述

小红最大可能的得分。

示例1

输入:

3 2
ab
cd
ef

输出:

1

说明:

选择下、下、右)这条路径即可,可以收集到 acef 这四个字母各一次,获得 0+0+1+0=1 分。

示例2

输入:

2 3
lle
ove

输出:

11

原站题解

C++ 解法, 执行用时: 6ms, 内存消耗: 1436KB, 提交时间: 2021-11-25

#include <bits/stdc++.h>
using namespace std;

int dp[550][550];

int main()
{
    char ch;
    int n,m,pt;
    cin>>n>>m;
    getchar();
    
    for(int i=1;i<=n;i++){
        
        for(int j=1;j<=m;j++){
            
            ch=getchar();
            
            switch(ch){
                    
                case 'l':
                    pt=4;
                    break;
                    
                case 'o':
                    pt=3;
                    break;
                    
                case 'v':
                    pt=2;
                    break;
                    
                case 'e':
                    pt=1;
                    break;
                    
                    default:
                    pt=0;
            }
            
            dp[i][j]=max(dp[i-1][j]+pt,dp[i][j-1]+pt);
        }
        
        getchar();
    }
    
    cout<<dp[n][m];
    return 0;
}

C 解法, 执行用时: 6ms, 内存消耗: 1540KB, 提交时间: 2022-03-07

#include<stdio.h>

char str[502][502]={0};
int dp[501][501]={0};

int main()
{
    int n,m,max=0;
    scanf("%d %d",&n,&m);
    getchar();
    for(int i=1;i<=n;++i)
    {
        gets(str[i]+1);
    }
    for(int i=1;i<=n;++i)
    {
        for(int j=1;j<=m;++j)
        {
            if(str[i][j] == 'l')
                dp[i][j] = 4;
            else if(str[i][j] == 'o')
                dp[i][j] = 3;
            else if(str[i][j] == 'v')
                dp[i][j] = 2;
            else if(str[i][j] == 'e')
                dp[i][j] = 1;
            else
                dp[i][j] = 0;
            dp[i][j] += dp[i-1][j]>dp[i][j-1]?dp[i-1][j]:dp[i][j-1];
            max = max<dp[i][j]?dp[i][j]:max;
        }
    }
    printf("%d",max);
    return 0;
}

C 解法, 执行用时: 6ms, 内存消耗: 1548KB, 提交时间: 2022-03-11

#include<stdio.h>
#include<stdlib.h>

inline int max(int n1, int n2)
{
    return n1>n2?n1:n2;
}
int num(char c)
{
    if(c=='l')
    {
        return 4;
    }
    else if(c=='o')
    {
        return 3;
    }
    else if(c=='v')
    {
        return 2;
    }
    else if(c=='e')
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
int main()
{
    int raw,column;
    scanf("%d",&raw);
    scanf("%d",&column);
    char str[500][500];
    for(int i=0;i<raw;i++)
    {
        scanf("%s",&str[i][0]);
    }
    int dp[501][501] = {0};
    for(int i=1;i<=raw;i++)
    {
        for(int j=1;j<=column;j++)
        {
            dp[i][j] = max(dp[i-1][j],dp[i][j-1]) + num(str[i-1][j-1]);
        }
    }
    printf("%d\n",dp[raw][column]);
    return 0;
}

C 解法, 执行用时: 6ms, 内存消耗: 1548KB, 提交时间: 2021-12-08

#include<stdio.h>

char str[502][502]={0};
int dp[501][501]={0};

int main()
{
    int n,m,max=0;
    scanf("%d %d",&n,&m);
    getchar();
    for(int i=1;i<=n;++i)
    {
        gets(str[i]+1);
        //printf("%s\n",str[i]+1);
    }

    
    for(int i=1;i<=n;++i)
    {
        for(int j=1;j<=m;++j)
        {
            if(str[i][j] == 'l')
                dp[i][j] = 4;
            else if(str[i][j] == 'o')
                dp[i][j] = 3;
            else if(str[i][j] == 'v')
                dp[i][j] = 2;
            else if(str[i][j] == 'e')
                dp[i][j] = 1;
            else
                dp[i][j] = 0;
            dp[i][j] += dp[i-1][j]>dp[i][j-1]?dp[i-1][j]:dp[i][j-1];
            max = max<dp[i][j]?dp[i][j]:max;
        }
    }
    printf("%d",max);
    return 0;
}

C 解法, 执行用时: 6ms, 内存消耗: 1560KB, 提交时间: 2021-11-29

int main()
{
    int n,m;
    int max = 0;
    scanf("%d %d", &n, &m);
    char arr[n][m];
    int dp[n][m];
    int tmp=0;
    memset(dp,0,sizeof(dp));
    for (int i=0; i<n; i++)
        scanf("%s", arr[i]);
    
   for (int i=0; i<n; i++)
        for (int j=0; j<m; j++)
        {
            switch(arr[i][j])
            {
                case'l':
                    dp[i][j] = 4;
                    break;
                case'o':
                    dp[i][j] = 3;
                    break;
                case'v':
                    dp[i][j] = 2;
                    break;
                case'e':
                    dp[i][j] = 1;
                    break;
            }
            if(i-1>=0)
            {
                if(j-1>=0)
                    dp[i][j] += dp[i-1][j]>dp[i][j-1]?dp[i-1][j]:dp[i][j-1];
                else
                    dp[i][j] += dp[i-1][j];
            }
            else
                if(j-1>=0)
                    dp[i][j] += dp[i][j-1];
            max = max > dp[i][j] ? max : dp[i][j];
        }
    printf("%d",max);
    return 0;
}

上一题