?? merge.cpp
字號:
#include <iostream.h>
#include <fstream.h>
#include <math.h>
void main()
{
ifstream fin("input.txt");
ofstream fout("output.txt");
int i,j,k,temp;
int stone_num;//石頭堆數
long int stone_value[102];//存儲每堆石頭的石子個數
//long int mark_max[102][102];//將列數堆石子合并成一堆的最大得分和
fin>>stone_num;//讀出石子堆數
for( i=1;i<=stone_num;i++)//讀出每堆石頭的石子個數
fin>>stone_value[i];
fin.close();//關閉輸入文件
temp=stone_num+1; //輔助開辟數組空間,不用下標包含[0]的這種空間
int **mark_max=new int *[temp];
for (i=0;i<temp;i++)
mark_max[i]=new int[temp];
//long int mark_min[102][102];//將列數堆石子合并成一堆的最小得分和
int **mark_min=new int *[temp];
for (i=0;i<temp;i++)
mark_min[i]=new int[temp];
//特殊值:對每一堆石子來說,它的max和c的值
for( i=1;i<=stone_num;i++)
{
mark_max[i][1]=0;
mark_min[i][1]=0;
}
//初始值:含有兩堆石子的stone_num個子序列的合并方案
for( j=2;j<=stone_num;j++)
for( i=1;i<=stone_num;i++)
{
long int total=0;//存儲從第i個石子堆開始,順序數j堆的石子總數
for(int s=1;s<=j;s++)
{
int temp2=(i+s-2)%stone_num+1;
total+=stone_value[temp2];
}
//初始化值
mark_max[i][j]=0;
mark_min[i][j]=100000000;
for( k=1;k<=(j-1);k++)
{
int x=(i+k-1)%stone_num+1;//第i堆數起,順時針數k+1堆的堆序列
//處理最大得分合并的情況
if(mark_max[i][j]<(mark_max[i][k]+mark_max[x][j-k]+total))
{
mark_max[i][j]=mark_max[i][k]+mark_max[x][j-k]+total;
}
//處理最小得分合并的情況
if(mark_min[i][j]>(mark_min[i][k]+mark_min[x][j-k]+total))
{
mark_min[i][j]=mark_min[i][k]+mark_min[x][j-k]+total;
}
}
}
long int max_num=0;//定義一個初值
long int min_num=100000000; //定義一個初值
//在子序列(1,stone_num),(1,stone_num),...,(1,stone_num)
//中,選擇得分總和最優的一個子序列。
for( i=1;i<=stone_num;i++)
{
if (max_num<mark_max[i][stone_num])
max_num=mark_max[i][stone_num];
if (min_num>mark_min[i][stone_num])
min_num=mark_min[i][stone_num];
}
fout<<min_num<<endl; //輸出最小得分結果
fout<<max_num<<endl; //輸出最大得分結果
//釋放二維數組分配空間
for ( i=0;i<temp;i++)
delete []mark_max[i];
delete []mark_max;
mark_max=0;
for ( i=0;i<temp;i++)
delete []mark_min[i];
delete []mark_min;
mark_min=0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -