我的算法比较麻烦。。。T_T........
有直接动态规划的算法,其实就是求一个区域内(图形是矩形切一个角)的最值问题。。根据MIN(G) = MIN(G1,G2),其中G1UG2=G即可。
根据这个公式搞出动态规划转移方程,由于我不是按照这样做的,故不加描述,请去到这里
http://hi.baidu.com/zyz913614263/item/4c05bdc8b59f5842bdef6958
我的做法是把内个图形搞成两部分分别处理,好麻烦。。。弱__弱。。。附代
#include <iostream>
#include <cstdio>
#define N 1004
#define ss(a) scanf("%d",&a)
#define INF 32500
using namespace std;
int a[N][N],t[2*N],f[N][N],g[N][N];
int main()
{
int n,m,i,j;
cin>>n>>m;
for (i=1;i<=n+m;i++)
{
t[i]=INF;
if (i<=m) g[n+1][i]=INF;
if (i<=n) g[i][m+1]=INF;
}
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
ss(a[i][j]);
for (i=n;i>=1;i--)
for (j=m;j>=1;j--)
g[i][j]=min(min(g[i+1][j],g[i][j+1]),a[i][j]);
for (i=1;i<=n;i++)
{
f[i][m+1]=INF;
for (j=m;j>=1;j--)
{
t[i+j]=min(t[i+j],a[i][j]);
f[i][j]=min(f[i][j+1],t[i+j]);
g[i][j]=min(g[i][j],f[i][j]);
}
}
for (i=1;i<=n;i++)
{
for (j=1;j<m;j++)
printf("%d ",g[i][j]);
printf("%d\n",g[i][m]);
}
// system("pause");
return 0;
}
码吧: