1 solutions
-
0
Guest MOD
-
4
#include <bits/stdc++.h> #define int long long #define endl '\n' using namespace std; const int N=1010,M=15; int a[N][N],dp[N][N][M],ans=-1e18-7; // dp[i][j][k] 表示当前走到了 (i,j) 点 共使用了 k 次技能所能得到的最大值 signed main(){ ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); int n,m,t; cin>>t>>n>>m; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin>>a[i][j]; // 输入 for(int i=0;i<N;i++) for(int j=0;j<N;j++) for(int k=0;k<M;k++) dp[i][j][k]=-1e18-7; // 因为本题要取最大值,所以初始值赋为一个极小值,即 -1e18-7 dp[1][1][0]=0; // 根据题意可知,点位 (1,1) 且使用技能次数为零的奖励的值应为 0 for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ // k 的枚举需要倒序是因为防止在一个点上使用两次技能 for(int k=t-1;k>=0;k--) dp[i][j][k+1]=max(dp[i][j][k+1],dp[i][j][k]); // 使用技能,即停留 for(int k=t;k>=0;k--){ // 不使用技能 if(i+1<=n) dp[i+1][j][k]=max(dp[i+1][j][k],dp[i][j][k]+(i+j+k-1)*a[i+1][j]); // 向下走 ↓ if(j+1<=m) dp[i][j+1][k]=max(dp[i][j+1][k],dp[i][j][k]+(i+j+k-1)*a[i][j+1]); // 向右走 → } } } for(int i=0;i<=t;i++) ans=max(ans,dp[n][m][i]); // 在所有可能的使用技能的次数中寻找一个 dp 值最大的 cout<<ans<<endl; return 0; }希望对大家有帮助,制作不易,点个赞吧
Information
- ID
- 1568
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 8
- Tags
- (None)
- # Submissions
- 42
- Accepted
- 8
- Uploaded By