1. 程式人生 > 實用技巧 >P1359租用遊艇(dp+dfs)

P1359租用遊艇(dp+dfs)

好久真的是好久沒有做dp的問題了(QWQ)(我有學過這玩意???)

誒,人生吶!

今天來一個動歸~

順便可以回顧一下dfs.

這個題我覺得審題也非常重要

小可愛dp:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int f[201],n,i,j,x; //f[x]表示從1到x的距離
 4 int main()
 5 {
 6     scanf("%d",&n);
 7     for (i=1;i<=n;i++)
 8         for (j=i+1;j<=n;j++)
 9         {
10 scanf("%d",&x); 11 if (f[j]==0||f[j]>f[i]+x) //如果j還沒有到過或者到j的距離比原來短 12 f[j]=f[i]+x; //替換 13 } 14 printf("%d\n",f[n]); //輸出到n的距離 15 }
 1 //好久沒有寫dfs啦
 2 // Created by snnnow on 2020/7/19.
 3 //
 4 
 5 #include<iostream>
 6 #include<stdio.h>
 7 #include<stdlib.h>
 8
#include<time.h> 9 #include <queue> 10 using namespace std; 11 int n,m[201][201],ans=9999999; 12 void dfs(int ,int);//層數,方法數 13 int main(){ 14 scanf("%d",&n); 15 for (int i = 1; i <= n; ++i) { 16 for (int j = i+1; j <= n ; ++j) { 17 scanf("%d",&m[i][j]);
18 } 19 20 } 21 dfs(1,0); 22 printf("%d",ans); 23 } 24 void dfs(int c,int ways){//你用的是dfs!!!找遞迴邊界!!! 25 if(ways>ans) 26 return ;//剪枝,剪掉多餘的部分 27 if(c==n) { 28 ans = ways; 29 return; 30 } 31 for (int i = 1+c; i <=n ; ++i) {//列舉下游各個點 32 dfs(i,ways+m[c][i]); 33 34 } 35 36 }