DP題。
狀態:以座標(i,j)為終點所能得的最高分。
轉移:dp(i,j) = ar(i,j) + max(0,dp(i-1,j),dp(i,j-1))。
Code:
#include <iostream> #include <cstdio> using namespace std; int n,m; int ar[3005][3005],dp[3005][3005]; int sol() { for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) dp[i][j]=ar[i][j]+max(0,max(dp[i-1][j],dp[i][j-1])); int ret=0; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) ret=max(ret,dp[i][j]); return ret; } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&ar[i][j]); printf("%d\n",sol()); return 0; }
沒有留言:
張貼留言