标签:
这道题完全没有必要去计算限制时间,把时间当做一个参数来做就行了。
知道了这一点之后就可以直接使用DP求解了
1 #include <algorithm> 2 #include <iostream> 3 #include <cstdlib> 4 #include <cstring> 5 #include <cmath> 6 using namespace std; 7 int Map[105][105]={0},N=0; 8 int DP[2][105][105]={0};//0时间1钱数 9 int main(void) 10 { 11 cin>>N; 12 for(int i=1;i<=N;i++) 13 for(int j=1;j<=N;j++) 14 cin>>Map[i][j]; 15 memset(DP,127/2,sizeof(DP)); 16 for(int i=1;i<=N;i++) 17 for(int j=1;j<=N;j++) 18 DP[0][i][j]=-1; 19 DP[1][N][N]=Map[N][N]; 20 DP[0][N][N]=2*N-1; 21 for(int i=N;i>=1;i--) 22 { 23 for(int j=N;j>=1;j--) 24 { 25 DP[1][i-1][j]=min(DP[1][i][j]+Map[i-1][j],DP[1][i-1][j]); 26 DP[0][i-1][j]=max(DP[0][i][j]-1,DP[0][i-1][j]); 27 28 DP[1][i][j-1]=min(DP[1][i][j]+Map[i][j-1],DP[1][i][j-1]); 29 DP[0][i][j-1]=max(DP[0][i][j]-1,DP[0][i][j-1]); 30 31 DP[1][i+1][j]=min(DP[1][i][j]+Map[i+1][j],DP[1][i+1][j]); 32 DP[0][i+1][j]=max(DP[0][i][j]-1,DP[0][i+1][j]); 33 34 DP[1][i][j+1]=min(DP[1][i][j]+Map[i][j+1],DP[1][i][j+1]); 35 DP[0][i][j+1]=max(DP[0][i][j]-1,DP[0][i][j+1]); 36 } 37 } 38 cout<<DP[1][1][1]; 39 return 0; 40 }
标签:
原文地址:http://www.cnblogs.com/CYWer/p/4805585.html