日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

北方大学 ACM 多校训练赛 第十五场 蜘蛛牌A

發布時間:2023/12/3 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 北方大学 ACM 多校训练赛 第十五场 蜘蛛牌A 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目描述

XCX最近迷上了玩蜘蛛牌。蜘蛛牌是windowsxp操作系統自帶的一款紙牌游戲,游戲規則是這樣的:只能將牌拖到比它大一的牌上面(A最小,K最大),如果拖動的牌上有按順序排好的牌時,那么這些牌也跟著一起移動,游戲的目的是將所有的牌按同一花色從小到大排好。為了簡單起見,我們的游戲只有同一花色的牌,但是這樣XCX又覺得太簡單了,于是他把牌數增加到了n(1<=n<=100),牌隨機的在一行上展開,編號從1到n,把第i號上的牌移到第j號牌上,移動距離為abs(i-j),現在你要做的是求出完成游戲的最小移動距離。

輸入描述

第一行T(1<=T<=1010)代表T組數據。每組數據包括兩行,第一行是一個數字n,代表有n張牌,第二行有n個數字:為1…n的一種排列。

輸出描述

最小移動距離

樣例輸入

1 10 3 10 4 2 5 9 1 8 6 7

樣例輸出

16 題解:

采用區間動態規劃的方式,但是直接進行區間DP是沒有任何意義的,因此需要對數列進行變化一下,我們進行dp的區間[a,b]定義為高度為a到高度為b的紙牌疊加到一起,所需要的最少距離和。在一開始,我們定義數組arr[x]中存儲的是高度為x的紙牌所在的位置。那么狀態轉移就可以寫成:dp[a][b] = dp[a][j] + dp[j+1][b] + abs(arr[b]-arr[j])


代碼:

#include<bits/stdc++.h> using namespace std;int a[105],n; int dp[105][105];int main() {int T;scanf("%d",&T);while(T--){scanf("%d",&n);for(int i=1;i<=n;i++){int x;scanf("%d",&x);a[x]=i;}for(int k=2;k<=n;k++){for(int i=1;i<=n-k+1;i++){int l=i,r=i+k-1;dp[l][r]=1e9+7;for(int j=l;j<=r-1;j++)dp[l][r]=min(dp[l][r],dp[l][j]+dp[j+1][r]+abs(a[r]-a[j]));}}printf("%d\n",dp[1][n]);}return 0; }



總結

以上是生活随笔為你收集整理的北方大学 ACM 多校训练赛 第十五场 蜘蛛牌A的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。