標籤:
哈爾濱理工大學OJ上的題目,水是很水,結果我做了好久,發現題中要迴圈輸入,我也是醉了。
題目很簡單但是心裡不平衡決定發一下。
Description上學的路總是那麼艱辛,在小樂樂辛苦的出了家門之後,她才想起自己的家已經搬到山上了(睡的真迷糊)。下山的路同樣十分艱難,不同的地方通行的難易程度也不同。,小樂樂現在在山頂上,她面前有兩條路,每條路通往一個地點,每個地點有一個值,表示這個通行的難易程度。最底層的地點就是山腳了。大家知道,小樂樂好懶好懶的,她想知道怎麼下山最省力?Input第一行一個整數n(1<n<500)
隨後n行,第i+1行有i個數字
表示山上的路況Output輸出從山頂到山腳最省力的路。(保證答案唯一)Sample Input
3
1
2 5
5 6 3
Sample Output
1 2 5
Hint輸入的是一個三角形,每個點能走到下面那個點和下右那個點。
1 #include<stdio.h> 2 #include<math.h> 3 #include<string.h> 4 #include<iostream> 5 using namespace std; 6 int a[600][600]; 7 int dp[600][600]; 8 int n; 9 int dpit(int i,int j)10 {11 if(i==n)12 return dp[i][j]=a[i][j];13 else14 return dp[i][j]=a[i][j]+min(dpit(i+1,j),dpit(i+1,j+1));15 }16 void print(int i,int j)17 {18 if(i>n) return ;19 if(dp[i][j]>dp[i][j+1])20 {21 printf("%d",a[i][j+1]);22 if(i!=n)23 printf(" ");24 else25 printf("\n");26 print(i+1,j+1);27 }28 else29 {30 printf("%d",a[i][j]);31 if(i!=n)32 printf(" ");33 else34 printf("\n");35 36 print(i+1,j);37 }38 }39 int main()40 {41 while(~scanf("%d",&n)){42 for(int i=1; i<=n; i++)43 for(int j=1; j<=i; j++)44 scanf("%d",&a[i][j]);45 memset(dp,0,sizeof(dp));46 //printf("%d",dp[1][1]);47 //int ans=dpit(1,1);48 for(int i=n; i>=1; i--)49 for(int j=1; j<=i; j++)50 {51 if(i==n)52 dp[i][j]=a[i][j];53 // printf("%d ",dp[i][j]);}54 else55 dp[i][j]=a[i][j]+min(dp[i+1][j],dp[i+1][j+1]);56 // printf("%d %d %d i=%d j=%d\n",dp[i+1][j],dp[i+1][j+1],a[i][j],i,j);57 /* printf("%d ",dp[i][j]);*/58 }59 /*for(int i=1;i<=n;i++)60 for(int j=1;j<=n;j++){61 printf("%3d",dp[i][j]);62 if(j==n)63 printf("\n");64 }*/65 printf("%d ",a[1][1]);66 print(2,1);67 }68 }
本題要求記錄路徑,不如我們來找路徑,反正已經把DP過程都儲存了,所以根據狀態轉移方程我們就可以再次找到路徑了,就是向著小的地方走。
動態規劃路徑輸出方法有好多,我會一一學習。
小樂樂要下山(腦殘動態規劃記錄路徑)