您的位置:首页 > 其它

POJ 2948 Martian Mining(DP)这是POJ第200道,居然没发现

2013-07-11 21:34 447 查看
题目链接

两种矿石,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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: