C - Decreasing Heights

194 篇文章 1 订阅
32 篇文章 0 订阅

链接:https://vjudge.net/contest/399019#problem/C

You are playing one famous sandbox game with the three-dimensional world. The map of the world can be represented as a matrix of size n×mn×m, where the height of the cell (i,j)(i,j) is ai,jai,j.

You are in the cell (1,1)(1,1) right now and want to get in the cell (n,m)(n,m). You can move only down (from the cell (i,j)(i,j) to the cell (i+1,j)(i+1,j)) or right (from the cell (i,j)(i,j) to the cell (i,j+1)(i,j+1)). There is an additional restriction: if the height of the current cell is xx then you can move only to the cell with height x+1x+1.

Before the first move you can perform several operations. During one operation, you can decrease the height of any cell by one. I.e. you choose some cell (i,j)(i,j) and assign (set) ai,j:=ai,j−1ai,j:=ai,j−1. Note that you can make heights less than or equal to zero. Also note that you can decrease the height of the cell (1,1)(1,1).

Your task is to find the minimum number of operations you have to perform to obtain at least one suitable path from the cell (1,1)(1,1) to the cell (n,m)(n,m). It is guaranteed that the answer exists.

You have to answer tt independent test cases.

Input

The first line of the input contains one integer tt (1≤t≤1001≤t≤100) — the number of test cases. Then tt test cases follow.

The first line of the test case contains two integers nn and mm (1≤n,m≤1001≤n,m≤100) — the number of rows and the number of columns in the map of the world. The next nn lines contain mm integers each, where the jj-th integer in the ii-th line is ai,jai,j (1≤ai,j≤10151≤ai,j≤1015) — the height of the cell (i,j)(i,j).

It is guaranteed that the sum of nn (as well as the sum of mm) over all test cases does not exceed 100100 (∑n≤100;∑m≤100∑n≤100;∑m≤100).

Output

For each test case, print the answer — the minimum number of operations you have to perform to obtain at least one suitable path from the cell (1,1)(1,1) to the cell (n,m)(n,m). It is guaranteed that the answer exists.

Example

Input

5
3 4
1 2 3 4
5 6 7 8
9 10 11 12
5 5
2 5 4 8 3
9 10 11 5 1
12 8 4 2 5
2 2 5 4 1
6 8 2 4 2
2 2
100 10
10 1
1 2
123456789876543 987654321234567
1 1
42

Output

9
49
111
864197531358023
0

代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll maxn=1e3+7;
const ll mod=0x3f3f3f3f3f3f3f3f;
ll t,n,m,k,s,ans,sum;
char x[maxn];
ll dp[maxn][maxn];
ll a[maxn][maxn];
ll b[maxn][maxn];
ll f(int p,int q)
{
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            b[i][j]=a[i][j]-a[p][q];
            dp[i][j]=mod;
        }
    }
    if(b[n][m]<0||b[1][1]<0)
        return mod;
    dp[1][1]=b[1][1];
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(b[i][j]<0)
                continue;
			if(i>1&&b[i-1][j]>=0)
			dp[i][j]=min(dp[i][j],dp[i-1][j]+b[i][j]);
			if(j>1&&b[i][j-1]>=0)
			dp[i][j]=min(dp[i][j],dp[i][j-1]+b[i][j]);
        }
    }
    //cout<<dp[n][n]<<endl;
    return dp[n][m];
}

int main()
{
    cin>>t;
    while(t--)
    {
        scanf("%lld %lld",&n,&m);
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                scanf("%lld",&a[i][j]);
                a[i][j]-=i+j-2;
            }
        }
        ans=mod;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                s=f(i,j);
                ans=min(ans,s);
            }
        }
        cout<<ans<<'\n';
    }
    return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值