1 solutions

  • 4
    @ 2025-8-19 22:58:06
    #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