Codeforces Round #642 (Div. 3) F —Decreasing Heights dp

#include <bits/stdc++.h>
using namespace std;
const int N=110;
typedef long long ll;
typedef pair<int,int> pii;
#define int ll
int T,n,m;
int in[N][N],dp[N][N];
set<int> st;
signed main()
{
	cin>>T;
	while(T--)
	{
		cin>>n>>m;
		st.clear();
		for(int i=0; i<n; i++)
			for(int j=0; j<m; j++)
				//因为只能往高度+1的,减去之后,也就变成只能往高度相同的走了
				cin>>in[i][j],in[i][j]-=i+j,st.insert(in[i][j]);
		ll ans=1e18;
		//以这个点为起始高度,默认为0 
		for(auto k:st)
		{
			for(int i=0; i<n; i++)
				for(int j=0; j<m; j++)
				{
					//变成0需要的操作次数
					int a=in[i][j]-k;
					dp[i][j]=1e18;
					//如果小于0,那么就说明高度是小于k的,那么这个点就不可能走到 
					if(a<0)
						continue;
					//如果大于等于0,那么就是需要的次数 
					if(i==0 && j==0)
						dp[i][j]=a;
					//状态转移 
					if(i!=0)
						dp[i][j]=min(dp[i][j],dp[i-1][j]+a);
					if(j!=0)
						dp[i][j]=min(dp[i][j],dp[i][j-1]+a);
				}
			ans=min(ans,dp[n-1][m-1]);
		}
		cout<<ans<<endl;
	}
	return 0;
}
posted @ 2020-05-16 21:47  晴屿  阅读(90)  评论(0编辑  收藏  举报