DP39. 字母收集
描述
有一个 的矩形方阵,每个格子上面写了一个小写字母。输入描述
输出描述
小红最大可能的得分。
示例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; }