【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 }
View Code
#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;
}

 

 

posted @ 2017-11-05 14:22  Chenyuanyang0001  阅读(160)  评论(0编辑  收藏  举报