石子归并
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 }
以上是关于石子归并的主要内容,如果未能解决你的问题,请参考以下文章