我是靠谱客的博主 忐忑小蝴蝶,这篇文章主要介绍10271 - Chopsticks,现在分享给大家,希望可以做个参考。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; const int maxn=5000+10; const int INF=1000000000; int a[maxn],dp[maxn][maxn]; int main() { int T; cin>>T; while(T--){ int k,n; scanf("%d%d",&k,&n); k+=8; for(int i=n;i>0;i--) scanf("%d",&a[i]); for(int i=1;i<=n;i++){ dp[i][0]=0; for(int j=1;j<=n;j++){ dp[i][j]=INF; } } for(int i=3;i<=n;i++){ for(int j=1;j<=k;j++){ if(i>=j*3&&dp[i-2][j-1]!=INF){ dp[i][j]=min(dp[i-1][j],dp[i-2][j-1]+(a[i]-a[i-1])*(a[i]-a[i-1])); } } } printf("%dn",dp[n][k]); } return 0; }

简单的说一下思路就好。先给这几双筷子按从大到小排序(其实本来输入是就是按照从小到大排序的)。然后先看一下状态转移方程式:
dp[i][j]=min(dp[i-1][j],dp[i-2][j-1]+(a[i]-a[i-1])*(a[i]-a[i-1]));
dp(i,j)表示用前i根筷子组成j组(a,b,c)的筷子其中最长的筷子无影响时的最小代价。我们注意到排序后i最优的方案一定是和i-1根组成一对。再从前面没有伴的筷子随便挑一只出来拼成三根。所以要预先判断dp(i-2,j-1)的状态是否存在。边界dp[i][0]=0。其他都为无穷大。

最后

以上就是忐忑小蝴蝶最近收集整理的关于10271 - Chopsticks的全部内容,更多相关10271内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(56)

评论列表共有 0 条评论

立即
投稿
返回
顶部