Hdoj 1078 题目足迹
题意:
n*n的矩阵,从(0,0)出发,每个点上有一个数值,每次只能水平或竖直的走至多k个格子,要求总的路线上的数值是严格单增的,并且使总的和最大。
代码:
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #define mem(a,b) memset(a,b,sizeof(a)) 6 #define forp(i,n) for(int i=0;i<n;i++) 7 8 const int MAXN = 105; 9 int n, k; 10 int _m[MAXN][MAXN]; 11 int dp[MAXN][MAXN]; 12 int di[4][2] = {1,0,-1,0,0,1,0,-1}; 13 //方向 14 int dfs( int x, int y){ 15 int maxx = 0; 16 //记录当前层最大值 17 int xx, yy, ans; 18 if(!dp[x][y]){ 19 forp(i,k){ 20 forp(j,4){ 21 xx = x + di[j][0]*(i+1); 22 yy = y + di[j][1]*(i+1); 23 if( xx >= 0 && xx < n && yy > 0 && yy < n && _m[xx][yy] > _m[x][y]){ 24 ans = dfs(xx,yy);//dp[xx][yy]的值 25 if( ans > maxx) 26 maxx = ans; 27 } 28 } 29 } 30 dp[x][y] = maxx + _m[x][y]; 31 } 32 printf("%d %d %d\n",x,y,dp[x][y]); 33 return dp[x][y]; 34 } 35 36 int main (){ 37 mem(_m,0); 38 while(~scanf("%d%d",&n,&k)){ 39 if( n == -1 && k == -1) 40 break; 41 forp(i,n) 42 forp(j,n) 43 scanf("%d",&_m[i][j]); 44 //数据读入 45 mem(dp,0); 46 int sum = dfs(0,0); 47 //从0点开始进行搜索 48 printf("%d\n",sum); 49 } 50 }
时间: 2024-10-07 02:28:45