dp
小象和老鼠
题目描述
输入格式
输出格式
样例
数据范围与提示
对于10%的数据,1<=N,M<=5。
对于100%的数据,1<=N,M<=1000,0<=Aij<=100。
思路:显然这是一道dp题,求什么定义什么,经过一番思考会发现二维不太好处理,因为要求老鼠种类不同,所以考虑加一维,设f[i][j][0]为前i行第j列由上面转移过来的最小害怕值,f[i][j][1]为前i行第j列由右面转移过来的最小害怕值.转移方程:f[i][j][0]=max(f[i][j][0]+a[i][j-1]+a[i][j+1]+a[i+1][j],f[i-1][j][1]+a[i+1][j]+a[i][j+1]);
f[i][j][1]=max(f[i][j-1][0]+a[i+1][j]+a[i][j+1],f[i][j-1][1]+a[i-1][j]+a[i][j+1]+a[i+1][j]);
注意初始化
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int maxn=1000+10; 6 int a[maxn][maxn],f[maxn][maxn][3]; 7 int main(){ 8 int n,m; 9 scanf("%d%d",&n,&m); 10 for(int i=1;i<=n;i++){ 11 for(int j=1;j<=m;j++){ 12 scanf("%d",&a[i][j]); 13 } 14 } 15 memset(f,0x3f,sizeof(f)); 16 f[1][0][0]=f[1][0][1]=a[1][1]; 17 f[0][1][0]=f[0][1][1]=a[1][1];//注意初始化 18 for(int i=1;i<=n;i++){ 19 for(int j=1;j<=m;j++){ 20 f[i][j][0]=min(f[i-1][j][0]+a[i][j-1]+a[i][j+1]+a[i+1][j],f[i-1][j][1]+a[i+1][j]+a[i][j+1]); 21 f[i][j][1]=min(f[i][j-1][0]+a[i+1][j]+a[i][j+1],f[i][j-1][1]+a[i-1][j]+a[i][j+1]+a[i+1][j]); 22 } 23 } 24 printf("%d\n",min(f[n][m][0],f[n][m][1])); 25 return 0; 26 }