研发岗机器采草莓最优决策(DP)
https://codefun2000.com/p/P1145
采草莓机器人在一个\(n * m\)的草莓矩阵内,从起点坐标\((0,0)\)出发,可以向右或向下两个方向移动,每个方格种植着不同价值的草莓,现在塔子哥规定了一个阈值\(g\),代表该机器人此行采集草莓的总价值的最低目标值,塔子哥想知道机器人计算完成任务所需要移动的最少移动次数可以满足这个阈值?
输入描述
第一行输入三个整数:\(n,m,g\) 以空格隔开。
接下来有nn行,每行有mm个整数,以空格隔开。这n*m个数字构成草莓矩阵.
数据范围:
\(1\leq n,m \leq 1000,1 \leq a_i \leq 500 , 1 \leq g \leq 1000000\)
输出描述
机器人完成任务所需移动的最少次数,不存在则返回-1
示例1
输入
1 1 8
10
输出
0
说明
机器人起点位置即可完成任务,不需要移动
示例2
输入
2 2 5
2 2
2 2
2
说明
需要向右移动一次,再向下移动一次
这个题就是一个dp,dp[i][j]指的是从(0,0)走到(i,j)的最大值,然后我们遍历一遍,判断一下就行。
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=2e3+100;
int a[maxn][maxn],dp[maxn][maxn];
int main(){
int n,m,k;
cin>>n>>m>>k;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++)
cin>>a[i][j];
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
dp[i][j]=max(dp[i-1][j],dp[i][j-1])+a[i][j];
}
}
int ans=0x3f3f3f3f;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(dp[i][j]>=k){
ans=min(ans,i-1+j-1);
}
}
}
if(ans==0x3f3f3f3f)
cout<<-1<<endl;
else
cout<<ans<<endl;
}