【洛谷】P6208 [USACO06OCT] Cow Pie Treasures G(dp)

1.思路:

比较裸的一道dp.

2.但是我想说的是一个坑点:

把这张地图看成一个四边形,那么我们可以发现,左上点(起点),到右下点(终点),它们练成的斜线以下的那部分是到达不了的。

即在dp的过程我们应该注意对行列的限制:

内循环 行坐标i的限制:列坐标j (i<=j)


即: 

for(int j=1;j<=c;j++)//列 在外循环!(至于为什么模拟一下就知道啦,肯定要将当前列的前一列
   //所有可能到达的点都先经过) 
   for(int i=1;i<=r&&i<=j;i++){//行  (i<=j!!!,最多只能往右下走,那么所有能走的位置一定只有右上三角形) 

具体细节看下方ACcode(注释嘎嘎详细,冲冲冲):

3.ACcode:


#include
using namespace std;
#define int long long
const int N=1e2+10;
int n,a[N][N],dp[N][N],r,c;
void solve() {
   cin>>r>>c;
   for(int i=1;i<=r;i++)
   for(int j=1;j<=c;j++)
   cin>>a[i][j];
   
  // dp[1][1]=a[1][1];
   
   for(int j=1;j<=c;j++)//列 在外循环!(至于为什么模拟一下就知道啦,肯定要将当前列的前一列
   //所有可能到达的点都先经过) 
   for(int i=1;i<=r&&i<=j;i++){//行  (i<=j!!!,最多只能往右下走,那么所有能走的位置一定只有右上三角形) 
   //当前位置由可能到达当前三个位置中的最大值占有 
   	dp[i][j]=max(dp[i-1][j-1],max(dp[i][j-1],dp[i+1][j-1]))+a[i][j];//转移方程 
   }
   cout<>t;
	while(t--) {
		solve();
	}
	return 0;
}




over~

你可能感兴趣的:(算法,c++,动态规划)