UVA 1347 Tour 記憶化搜尋dp

2021-09-10 07:10:34 字數 727 閱讀 7358

題意:見紫書

分析:可以看成兩個人一起走,dp[i][j]表示已經走過了max(i,j)個點還剩多長距離到達最後的點,規定i走在j前面,走的時候只往下走max(i,j)+1的那個點即可,最後的狀態就是乙個人在第n-1個點,求出另乙個人在其他點時的最後所剩距離,然後dfs

**:

#include #include #include #include #include #include #include #include #define frer() freopen("in.txt","r",stdin)

#define frew() freopen("out.txt","w",stdout)

#define go int t;cin>>t;while(t--)

#define debug cout<<"****************"typedef long long ll;

const int maxn = 10000 + 7,inf = 0x3f3f3f3f;

int n;

struct point p[maxn];

double dp[maxn][maxn];

double dist(int i,int j)

double dfs(int i,int j)

int main()

printf("%.2f\n",dfs(1, 1));

}return 0;

}

UVA 1347 Tour 雙調旅行商

題意 平面上有n個點。乙個人要從左上角的點向右走,到右下角的點,然後再回到左上角的點。現在想讓這個人每個點到達一次,且走的總路程的距離最小。求出最小的距離。思路 雙調旅行商問題。因為起點和中途點已知,我們可以把這個問題轉化成兩個人從左上角出發,分別不重複的到達其他點,最後在右下角的點匯合。可以注意到...

uva 10118 免費糖果 深搜 記憶化搜尋

uva 10118 include include define n 45 define c 22 int max int a,int b int pile 4 n f n n n n n,top 4 int dfs int s,int hash c if s 5 籃子滿了,末狀態 return f...

skiing 記憶化深搜

這道題就是找出一條最長連續遞減序列,並求出其長度。可以用記憶化深搜,求出每一點最長序列的長度,然後求最大值即可。如下 include includeusing namespace std const int n 105 int a n n m,n,f n n inline int max int a...