标签:
题意:有n*m的矩阵,人的初始力量值为k,矩阵上有数字表示高度,相邻点高度差的绝对值除k,为力量消耗量,求给定起点终点消耗力量的最小值;
思路:dp[k][x][y]表示第k步走到(x,y)时的最小力量消耗,建立递推;
#include<cstdio> #include<cmath> #include<cstring> #include<algorithm> using namespace std; #define inf 0x3f3f3f3f int t,n,m; int s1,s2,t1,t2; double ans; char mm[55][55]; int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; double dp[55][55][55]; int main(){ int i,j,k,p,q; scanf("%d",&t); while(t--){ scanf("%d%d%d",&n,&m,&k); getchar(); for(i=1;i<=n;i++){ for(j=1;j<=m;j++){ scanf(" %c",&mm[i][j]); } } scanf("%d%d",&s1,&s2); scanf("%d%d",&t1,&t2); // memset(dp,inf,sizeof(dp)); for(i=0;i<=n;i++) //用memset初始化不行 for(j=0;j<=m;j++) for(p=0;p<=k;p++){ dp[p][i][j]=inf; } dp[k][s1][s2]=0; for(p=k;p>0;p--) for(i=1;i<=n;i++){ for(j=1;j<=m;j++){ for(q=0;q<4;q++){ int xx=i+dir[q][0]; int yy=j+dir[q][1]; if(xx<=0||yy<=0||xx>n||yy>m||mm[xx][yy]==‘#‘) continue; dp[p-1][xx][yy]=min(dp[p-1][xx][yy],dp[p][i][j]+(double)abs(mm[xx][yy]-mm[i][j])/p); } } } ans=inf; for(p=1;p<=k;p++){ ans=min(ans,dp[p][t1][t2]); } if(ans==inf) printf("No Answer\n"); else printf("%.2f\n",ans); } return 0; }
hdu 5433 Xiao Ming climbing(用dp代替搜索)
标签:
原文地址:http://www.cnblogs.com/dominatingdashuzhilin/p/4804010.html