石子合并问题
2015-05-05 16:56
246 查看
<a target=_blank href="http://www.cnblogs.com/SCAU_que/articles/1893979.html">参考1</a>
<a target=_blank href="http://blog.csdn.net/acdreamers/article/details/18039073">参考网站2</a> #include<iostream> using namespace std; #include<string.h> #include<fstream> const int INF= 1<<30; const int INFS=1>>30; const int N=100; int dp ; int sum ; int a ; int MinScore(int a[], int n) { int i; sum[0]=a[0]; for(i=1;i<n;i++) sum[i]=sum[i-1]+a[i]; for(int i=0;i<n;i++) dp[i][i] = 0; for(int itval=1;itval<n;itval++) { for(int i=0;i<=n-itval-1;i++) { int j=i+itval; dp[i][j]=INF; int lastadd=sum[j]-(i>0?sum[i-1]:0); for(int k=i;k<j;k++) { dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+lastadd); } } } return dp[0][n-1]; } int MaxScore(int a[],int n) { for(int itval=1;itval<n;itval++) { for(int i=0;i<=n-itval-1;i++) { int j=i+itval; dp[i][j]=INFS; int lastadd=sum[j]-(i>0?sum[i-1]:0); for(int k=i;k<j;k++) dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j]+lastadd); } } return dp[0][n-1]; } int main() { fstream fin("input.txt"); fstream fout("output.txt"); int n,i,minval,maxval; int max=0,min=0; // cout<<"请输入石子数n="; // cin>>n; // for(i=0;i<n;i++) // { // cout<<"请输入第"<<i+1<<"堆石子数"; // cin>>a[i]; // } fin>>n; for(i=0;i<n;i++) fin>>a[i]; min=MinScore(a,n); max=MaxScore(a,n); for(int j=1;j<=n-1;j++) { int temp=a[0]; for(int i=1;i<=n-1;i++) { a[i-1]=a[i]; } a[n-1]=temp; minval=MinScore(a,n); maxval=MaxScore(a,n); if(minval<min) min=minval; if(maxval>max) max=maxval; } fout<<"最小分数为="<<min<<endl; fout<<"最大分数为="<<max<<endl; fin.close(); fout.close(); }
相关文章推荐
- NK1137 石子合并问题
- Hrbust 1819 石子合并问题--圆形版【环形区间Dp】
- 区间DP问题(矩阵连乘,石子合并,括号匹配)
- 石子合并问题--动态规划;贪心
- 石子合并问题---圆形版
- 石子(环形)合并问题_dp
- (转)石子合并问题
- 石子合并问题(内含BZOJ3229 AC代码)
- 石子合并问题
- YTU.1724: 石子合并问题(W)
- 石子合并问题
- 石子合并;圈型;动态规划;重点在于处理圈型问题;代码内有算法解释;
- 南邮 OJ 1225 石子合并问题
- 石子合并问题
- 石子合并问题(一) (基础的区间dp)
- 石子合并问题
- 石子合并问题
- 石子合并问题
- 【dp】石子合并问题
- 石子合并问题 --动态规划--解法1