【Noip2017模拟题——好路线】
题目:好路线
题目描述:不告诉你
思路:
程序:
1 #include<bits/stdc++.h> 2 const int maxn=50+5; 3 const int inf=1e9+7; 4 using namespace std; 5 inline void read(int &x) 6 { 7 x=0;int k=1;char c=getchar(); 8 while(c<'0'||c>'9'){ 9 if(c=='-')k=-1; 10 c=getchar(); 11 } 12 while(c>='0'&&c<='9'){ 13 x=x*10+c-'0'; 14 c=getchar(); 15 } 16 } 17 int n,m; 18 int g[maxn][maxn],g_max=-inf; 19 int dp[maxn][maxn][125000+5]; 20 int ans=inf; 21 int main() 22 { 23 freopen("route.in","r",stdin); 24 freopen("route.out","w",stdout); 25 read(n);read(m); 26 for(register int i=1;i<=n;++i) 27 for(register int j=1;j<=m;++j){read(g[i][j]);if(g[i][j]>g_max)g_max=g[i][j];} 28 for(register int i=1;i<=n;++i) 29 for(register int j=1;j<=m;++j) 30 for(register int k=0;k<=g_max*(n+m-1);++k)dp[i][j][k]=inf; 31 dp[1][1][g[1][1]]=g[1][1]*g[1][1]; 32 for(register int i=1;i<=n;++i) 33 for(register int j=1;j<=n;++j) 34 for(register int k=0;k<=g_max*(n+m-1);++k){ 35 if(dp[i][j][k]==inf)continue; 36 int tmpx,tmpy,tmp=g[i][j]; 37 tmpx=i+1;tmpy=j; 38 dp[tmpx][tmpy][k+g[tmpx][tmpy]]=min(dp[tmpx][tmpy][k+g[tmpx][tmpy]],dp[i][j][k]+g[tmpx][tmpy]*g[tmpx][tmpy]); 39 tmpx=i;tmpy=j+1; 40 dp[tmpx][tmpy][k+g[tmpx][tmpy]]=min(dp[tmpx][tmpy][k+g[tmpx][tmpy]],dp[i][j][k]+g[tmpx][tmpy]*g[tmpx][tmpy]); 41 } 42 for(register int i=1;i<=g_max*(n+m-1);++i)if(dp[n][m][i]!=inf)ans=min(ans,(n+m-1)*dp[n][m][i]-i*i); 43 printf("%d",ans); 44 return 0; 45 }
#include<bits/stdc++.h> const int maxn=50+5; const int inf=1e9+7; using namespace std; inline void read(int &x) { x=0;int k=1;char c=getchar(); while(c<'0'||c>'9'){ if(c=='-')k=-1; c=getchar(); } while(c>='0'&&c<='9'){ x=x*10+c-'0'; c=getchar(); } } int n,m; int g[maxn][maxn],g_max=-inf; int dp[maxn][maxn][12500+5]; int ans=inf; int main() { freopen("route.in","r",stdin); freopen("route.out","w",stdout); read(n);read(m); for(register int i=1;i<=n;++i) for(register int j=1;j<=m;++j){read(g[i][j]);if(g[i][j]>g_max)g_max=g[i][j];} for(register int i=1;i<=n;++i) for(register int j=1;j<=m;++j) for(register int k=0;k<=g_max*(n+m-1);++k)dp[i][j][k]=inf; dp[1][1][g[1][1]]=g[1][1]*g[1][1]; for(register int i=1;i<=n;++i) for(register int j=1;j<=m;++j) for(register int k=0;k<=g_max*(n+m-1);++k){ if(dp[i][j][k]==inf)continue; int tmpx,tmpy,tmp=g[i][j]; tmpx=i+1;tmpy=j; dp[tmpx][tmpy][k+g[tmpx][tmpy]]=min(dp[tmpx][tmpy][k+g[tmpx][tmpy]],dp[i][j][k]+g[tmpx][tmpy]*g[tmpx][tmpy]); tmpx=i;tmpy=j+1; dp[tmpx][tmpy][k+g[tmpx][tmpy]]=min(dp[tmpx][tmpy][k+g[tmpx][tmpy]],dp[i][j][k]+g[tmpx][tmpy]*g[tmpx][tmpy]); } for(register int i=1;i<=g_max*(n+m-1);++i)if(dp[n][m][i]!=inf)ans=min(ans,(n+m-1)*dp[n][m][i]-i*i); printf("%d",ans); return 0; }