| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
内存占用如何能少点,AC代码#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
using namespace std;
int theMinHeigh[1000][1000];//一个数组 数组中(i,h)保存经过 i步到达 h 高度中 最高点的最小值,若无法到达赋值为-1
bool UpOrDown[1000][1000];//一个标记数组,取值 向上 或 向下
//该函数实现问题求解
string GetResult(int a[],int size)
{
for (int i = 0; i < 1000; i++)
for (int j = 0; j < 1000; j++)
theMinHeigh[i][j] = -1;
theMinHeigh[0][0] = 0;//初始化为0
for(int NumOfSteps=1;NumOfSteps<=size;NumOfSteps++) ///外层循环由 步数控制
for (int heigh = 0; heigh < 1000; heigh++)
{
int Num1 = -1;
int Num2 = -1;
if (heigh - a[NumOfSteps - 1] >= 0)
{
if (theMinHeigh[NumOfSteps - 1][heigh - a[NumOfSteps - 1]] != -1) //判断前一步能否到达 heigh-m高度 m为当前步数移动高度
{
//到达当前位置路途所经过的最高点,在以下2个中取较大值
Num1 = max(theMinHeigh[NumOfSteps - 1][heigh - a[NumOfSteps - 1]], heigh);
}
}
if (heigh + a[NumOfSteps - 1] <= 1000)
{
if (theMinHeigh[NumOfSteps - 1][heigh + a[NumOfSteps - 1]] != -1)
{
//前一步到达 heigh+M位置,那么向下爬m到达当前位置,路途中经过的最高点 与前一步一致
Num2 = theMinHeigh[NumOfSteps - 1][heigh + a[NumOfSteps - 1]];
}
}
//到达某一高度,最多可由2种前一步向下或向上到达,分析2者最高点,取其较小值
if (Num1 == -1 && Num2 == -1)
theMinHeigh[NumOfSteps][heigh] = -1;//表示无法经过这么多步到达改点
if (Num1 == -1 && Num2 != -1)
{
//仅由前一步向下移动而来
theMinHeigh[NumOfSteps][heigh] = Num2;
UpOrDown[NumOfSteps][heigh] = false;
}
if (Num1 != -1 && Num2 == -1)
{
//经由前一步向上移动而来
theMinHeigh[NumOfSteps][heigh] = Num1;
UpOrDown[NumOfSteps][heigh] = true;
}
if (Num1 != -1 && Num2 != -1)
{
//若可由前一步向上,或向下而来。取其较小者
if (Num1 < Num2)
{
theMinHeigh[NumOfSteps][heigh] = Num1;
UpOrDown[NumOfSteps][heigh] = true;
}
else
{
theMinHeigh[NumOfSteps][heigh] = Num2;
UpOrDown[NumOfSteps][heigh] = false;
}
}
}
//循环结束 数组 (n,0)位置表示经过n步重新回到0位置,途中经过最高点的最小值
string result;
if (theMinHeigh[size][0] == -1)
{
result = "IMPOSSIBLE";
return result;
}
//依次从最后一个往前读取出移动方向
int theheigh = 0;
for (int step = size; step >= 1; step--)
{
//若由前一步向下移动而来,前一步高度 theheigh+=a[i];
if (UpOrDown[step][theheigh] == false)
{
result += "D";
theheigh += a[step-1];
}
else
{
result += "U";
theheigh -= a[step-1];
}
}
string msg;
for (int i = 0; i < result.size(); i++)
msg += result[result.size() - i-1];
return msg;
}
int main()
{
int testDatas;
cin >> testDatas;
vector<string> results;
for (int i = 0; i < testDatas; i++)
{
int size;
cin >> size;
int *datas = new int[size];
for (int j = 0; j < size; j++)
{
cin >> datas[j];
}
results.push_back(GetResult(datas, size));
delete[]datas;
}
for (int i = 0; i < results.size(); i++)
cout << results[i] << endl;
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator