POJ 2948 Martian Mining(DP)这是POJ第200道,居然没发现
2013-07-11 21:34
447 查看
题目链接
两种矿石,Y和B,Y只能从从右到左,B是从下到上,每个空格只能是上下或者左右,具体看图。求左端+上端最大值。
很容易发现如果想最优,分界线一定是不下降的,分界线上面全是往上,分界线下面都是往左,然后就发现每一行,只和上一行有关系,DP可搞。
应该可以单调队列优化,我直接暴力水过了。。
两种矿石,Y和B,Y只能从从右到左,B是从下到上,每个空格只能是上下或者左右,具体看图。求左端+上端最大值。
很容易发现如果想最优,分界线一定是不下降的,分界线上面全是往上,分界线下面都是往左,然后就发现每一行,只和上一行有关系,DP可搞。
应该可以单调队列优化,我直接暴力水过了。。
#include <cstdio> #include <cstring> #include <iostream> #include <cmath> #include <algorithm> using namespace std; int dp[501][501]; int sum1[501][501]; int sum2[501][501]; int p1[501][501]; int p2[501][501]; int main() { int n,m,i,j,k,ans; while(scanf("%d%d",&n,&m)!=EOF) { if(n == 0&&m == 0) break; memset(dp,0,sizeof(dp)); for(i = 1;i <= n;i ++) { for(j = 1;j <= m;j ++) scanf("%d",&p1[i][j]); } for(i = 1;i <= n;i ++) { for(j = 1;j <= m;j ++) scanf("%d",&p2[i][j]); } for(i = 1;i <= n;i ++) { for(j = 1;j <= m;j ++) { sum1[i][j] = sum1[i][j-1] + p1[i][j]; sum2[i][j] = sum2[i][j-1] + p2[i][j]; } } for(i = 1;i <= n;i ++) { for(j = 0;j <= m;j ++) { for(k = 0;k <= j;k ++) { dp[i][j] = max(dp[i][j],dp[i-1][k]+sum1[i][j]+sum2[i][m]-sum2[i][j]); } } } ans = 0; for(i = 0;i <= m;i ++) ans = max(ans,dp [i]); printf("%d\n",ans); } return 0; }
相关文章推荐
- POJ 2948 Martian Mining(DP)
- poj 2948 Martian Mining_简单dp
- poj2948--Martian Mining(dp)
- POJ 2948 Martian Mining(简单的二维dp)
- POJ 2948 Martian Mining(DP)
- poj 2948 Martian Mining (dp)
- poj 2948 -- Martian Mining(dp)
- POJ 2948 Martian Mining [DP]
- poj 2948 简单dp
- poj 2948 比较好的dp,方向不是一个的最优方案dp,可以作为以后出题,如果改成4个方向的怎么解决?
- (中等) POJ 2948 Martian Mining,DP。
- poj 2948 Martian Mining
- poj 2948 Martian Mining
- POJ 2948 经典二维dp
- POJ2948--Martian Mining
- poj-2948 Martian Mining
- Poj 2948 Martian Mining
- poj 2948 Martian Mining
- POJ 2948 Martian Mining
- POJ 2948 DP