官方题解 | #字母收集#

字母收集

http://www.nowcoder.com/practice/9740ce2df0a04399a5ade1927d34c1e1

字母收集

难度:2星

经典的二维dp题目。设从起点到当前点的最大收益为 dp[i][j]dp[i][j],那么显然当前点 (i,j)(i,j) 要么从 (i1,j)(i-1,j) 过来,要么从 (i,j1)(i,j-1) 过来。因此有dp方程:

dp[i][j]=max(dp[i1][j],dp[i][j1])+val[i][j]dp[i][j]=max(dp[i-1][j],dp[i][j-1])+val[i][j]

其中 val[i][j]val[i][j] 代表当前字母的权值。

#include<bits/stdc++.h>
using namespace std;
int dp[555][555];
string a[555];
int f(char c){
    if(c=='l')return 4;
    if(c=='o')return 3;
    if(c=='v')return 2;
    if(c=='e')return 1;
    return 0;
}
int main(){
    int n,m,i,j;
    cin>>n>>m;
    for(i=0;i<=n;i++)cin>>a[i];
    for(i=0;i<n;i++){
        for(j=0;j<m;j++){
            int temp=0;
            if(i>0)temp=max(temp,dp[i-1][j]);
            if(j>0)temp=max(temp,dp[i][j-1]);
            dp[i][j]=temp+f(a[i][j]);
        }
    }
    cout<<dp[n-1][m-1];
}
全部评论
谢谢你的代码~不过兄dei 你for(i=0;i<=n;i++)cin>>a[i];这行应该把<=换成< 这样子更好些叭俺感觉
点赞 回复 分享
发布于 2022-12-24 21:45 北京

相关推荐

牛客41406533...:回答他在课上学,一辈子待在学校的老教授用三十年前的祖传PPT一字一句的讲解,使用谭浩强红皮书作为教材在devc++里面敲出a+++++a的瞬间爆出114514个编译错误来学这样才显得专业
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务