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;
}
标签:typedef,int,ll,Codeforces,long,st,642,Heights,dp 来源: https://www.cnblogs.com/QingyuYYYYY/p/12902332.html