石子归并

Posted chunibyo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了石子归并相关的知识,希望对你有一定的参考价值。

 1 #include<bits/stdc++.h>
 2 #include<iostream>
 3 #include<cstdio>
 4 #include<cstdlib>
 5 #include<cstring>
 6 #include<cmath>
 7 #include<algorithm>
 8 #include<queue>
 9 #include<vector>
10 #include<map>
11 #define lson i<<2
12 #define rson i<<2|1
13 #define LS l,mid,lson
14 #define RS mid+1,r,rson
15 #define mem(a,x) memset(a,x,sizeof(a))
16 #define gcd(a,b) __gcd(a,b)
17 #define ll long long
18 #define ull unsigned long long
19 #define lowbit(x) (x&-x)
20 #define pb(x) push_back(x)
21 #define enld endl
22 #define mian main
23 #define itn int
24 #define prinft printf
25 #pragma GCC optimize(2)
26 #pragma comment(linker, "/STACK:102400000,102400000")
27 
28 const double PI = acos (-1.0);
29 const int INF = 0x3f3f3f3f;
30 const int EXP = 1e-8;
31 const int N = 1e5 + 5;
32 const int MOD = 1e9 + 7;
33 const int MAXN = 4e4;
34 
35 using namespace std;
36 
37 //int a[MAXN];
38 int sum[105];
39 int dp[105][105];
40 int n;
41 
42 int main() {
43     cin>>n;
44     sum[0]=0;
45     for(int i=0; i<=n; ++i)
46         for(int j=0; j<=n; ++j)
47             if(i==j)
48                 dp[i][j]=0;
49             else
50                 dp[i][j]=INF;
51     for(int i=1; i<=n; ++i) {
52         cin>>sum[i];
53         sum[i]+=sum[i-1];
54     }
55     /*
56     for(int len=1; len<=n; ++len) { //枚举区间长度
57         for(int i=1; i+len-1<=n; ++i) { //枚举起点
58             int j=i+len-1;//枚举(获取)终点
59             for(int k=i; k+1<=j; ++k) { //枚举中间点
60                 dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]);
61             }
62         }
63     }
64     
65     for(int j=1;j<=n;++j) { //枚举终点
66         for(int i=j;i>=1;i--) { //枚举起点
67             for(int k=i;k+1<=j;++k) { //枚举中间点
68                 dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]);
69             }
70         }
71     }
72     */
73     cout<<dp[1][n]<<endl;
74 }

 

环形

 1 #include<bits/stdc++.h>
 2 #include<iostream>
 3 #include<cstdio>
 4 #include<cstdlib>
 5 #include<cstring>
 6 #include<cmath>
 7 #include<algorithm>
 8 #include<queue>
 9 #include<vector>
10 #include<map>
11 #define lson i<<2
12 #define rson i<<2|1
13 #define LS l,mid,lson
14 #define RS mid+1,r,rson
15 #define mem(a,x) memset(a,x,sizeof(a))
16 #define gcd(a,b) __gcd(a,b)
17 #define ll long long
18 #define ull unsigned long long
19 #define lowbit(x) (x&-x)
20 #define pb(x) push_back(x)
21 #define enld endl
22 #define mian main
23 #define itn int
24 #define prinft printf
25 #pragma GCC optimize(2)
26 #pragma comment(linker, "/STACK:102400000,102400000")
27 
28 const double PI = acos (-1.0);
29 const int INF = 0x3f3f3f3f;
30 const int EXP = 1e-8;
31 const int N = 1e5 + 5;
32 const int MOD = 1e9 + 7;
33 const int MAXN = 4e4;
34 
35 using namespace std;
36 
37 //int a[MAXN];
38 int sum[205];
39 int dp1[205][205];
40 int dp2[205][205];
41 int n;
42 int a[205];
43 int ans1=INF,ans2=0;
44 
45 int main() {
46     cin>>n;
47     sum[0]=0;
48     for(int i=0; i<=n*2; ++i)
49         for(int j=0; j<=n*2; ++j)
50             if(i==j)
51                 dp1[i][j]=0,dp2[i][j]=0;
52             else
53                 dp1[i][j]=INF,dp2[i][j]=0;
54     for(int i=1; i<=n; ++i) {
55         cin>>a[i];
56         a[i+n]=a[i];
57     }
58     for(int i=1; i<=2*n; ++i) {
59         sum[i]=sum[i-1]+a[i];
60     }
61     /*
62     for(int r=1; r<=n; ++r) {
63         for(int len=1; len<=n; ++len) { //枚举区间长度
64             for(int i=r; i+len-1<=n+r-1; ++i) { //枚举起点
65                 int j=i+len-1;//枚举(获取)终点
66                 for(int k=i; k+1<=j; ++k) { //枚举中间点
67                     dp1[i][j]=min(dp1[i][j],dp1[i][k]+dp1[k+1][j]+sum[j]-sum[i-1]);
68                     dp2[i][j]=max(dp2[i][j],dp2[i][k]+dp2[k+1][j]+sum[j]-sum[i-1]);
69                 }
70             }
71         }
72         ans1=min(ans1,dp1[r][r+n-1]),ans2=max(ans2,dp2[r][r+n-1]);
73     }
74     
75     for(int r=1; r<=n; ++r) {
76         for(int j=r; j<=n+r-1; ++j) {
77             for(int i=j; i>=1; i--) {
78                 for(int k=i; k+1<=j; ++k) {
79                     dp1[i][j]=min(dp1[i][j],dp1[i][k]+dp1[k+1][j]+sum[j]-sum[i-1]);
80                     dp2[i][j]=max(dp2[i][j],dp2[i][k]+dp2[k+1][j]+sum[j]-sum[i-1]);
81                 }
82             }
83         }
84         ans1=min(ans1,dp1[r][r+n-1]),ans2=max(ans2,dp2[r][r+n-1]);
85     }
86     */
87     
88     cout<<ans1<<endl<<ans2<<endl;
89 }

 

以上是关于石子归并的主要内容,如果未能解决你的问题,请参考以下文章

1048 石子归并

1048 石子归并

codevs 1048石子归并

51Nod - 1021 石子归并

线状DP(石子归并)

石子合并