大致算法:
从左往右,记录每个位置所有符合要求的最后一个数数值&加权和,分别放在一个数组中维护,最后在数组中取得最大值。
AC代码:
#include <stdio.h>
int main()
{
while (1)
{
int N = 0;
scanf("%d", &N);
if (N == 0)
{
break;
}
int num[1100] = { 0 };
int *pMaxNum = new int[N*N];
int *pSum = new int[N*N];
for (int i = 0; i < N; i++)
{
scanf("%d", &num[i]);
}
int k = 0;
for (int i = 0; i < N; i++)
{
/* 挑选最优的加进去 */
int BESTSUM = 0;
int BESTMAX = 0;
bool bOK = false;
int A = k;
for (int j = 0; j < A; j++)
{
if (pMaxNum[j] < num[i])
{
if (pSum[j] + num[i] > BESTSUM)
{
bOK = true;
BESTMAX = num[i];
BESTSUM = pSum[j] + num[i];
}
}
}
if (true == bOK)
{
pMaxNum[k] = BESTMAX;
pSum[k] = BESTSUM;
k++;
}
pMaxNum[k] = num[i];
pSum[k] = num[i];
k++;
}
int MAX = pSum[0];
for (int i = 0; i < k; i++)
{
if (pSum[i] > MAX)
{
MAX = pSum[i];
}
}
printf("%d\n", MAX);
delete pMaxNum;
delete pSum;
}
return 0;
}