我是靠谱客的博主 重要缘分,这篇文章主要介绍UVA 10271--Chopsticks(dp),现在分享给大家,希望可以做个参考。

题意:n跟筷子,要配成k+8副,每副需要3根筷子,其中bad值是两根短的的差的平方,要求最小bad值

思路:一个比较标准的dp,dp[i][j]表示前i根筷子配成j副筷子的最小bad值。再就是有一点思维,要从大的往小的筷子上考虑、因为第三根一定是要最长的,并且不参与计算bad值,所以只要比两根短的大就可以、从大的到小的考虑,可以巧妙的避开这一点
感想:很粗心。。5000的数组开成了1000.。再就是中间的公式少了个+1.。。wa+3.。。蓝瘦。。
代码:
复制代码
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
37
38
39
#include<bits/stdc++.h> using namespace std; #define inf 0x3f3f3f3f #define mod 1000000007 long long n,ans,k,T,s,dp[5050][1050],pos[5050]; bool cmp(long long aa,long long bb) { return aa>bb; } int main() { scanf("%lld",&T); while(T--) { scanf("%lld%lld",&k,&n); k+=8; for(int i=1;i<=n;i++) { scanf("%lld",&pos[i]); } sort(pos+1,pos+n+1,cmp); memset(dp,0x3f3f3f3f,sizeof(dp)); dp[0][0]=0; for(int i=1;i<=n;i++) { for(int j=0;j<=(i-1)/3;j++) { dp[i][j]=min(dp[i][j],dp[i-1][j]); if((i+1)/3>=j+1) dp[i+1][j+1]=min(dp[i+1][j+1],dp[i-1][j]+((pos[i+1]-pos[i])*(pos[i+1]-pos[i]))); //cout<<"!!!! "<<((pos[i]-pos[i+1])*(pos[i]-pos[i+1]))<<endl; //cout<<i-1<<" "<<j<<" "<<dp[i-1][j]<<endl<<i<<" "<<j<<" "<<dp[i][j]<<endl<<i+1<<" "<<j+1<<" "<<dp[i+2][j+1]<<endl; // cout<<i<<" "<<j<<" "<<dp[i][j]<<endl; } } printf("%lldn",dp[n][k]); } }

最后

以上就是重要缘分最近收集整理的关于UVA 10271--Chopsticks(dp)的全部内容,更多相关UVA内容请搜索靠谱客的其他文章。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部