问编程高手一道问题的算法

来源:百度知道 编辑:UC知道 时间:2024/05/22 12:39:35
一种滑雪比赛规则如下:在滑雪的路上插有若干面旗子,每面旗子上面有一个自然数,称为该旗子的分数。滑雪者在经过每面旗子时,可选择绕过或不绕过该旗子。但每次绕过旗子的分数必须大于上次绕过旗子的分数。如何滑才能使绕过的旗子的分数总和最大?

/*gcc编译通过*/
/*如果有多种选择能达到最优解,则这个程序对路径的选择是任意的*/
#include <stdio.h>
#include <mem.h>
#define MAXL 1000

int mark[MAXL],n;
int work[MAXL][2];
int ts[MAXL];

int main()
{
int i,j,res;
while(1)
{
/*输入的总旗子数量*/
scanf("%d",&n);

/*输入非正数则退出程序*/
if(n<=0) break;

/*依次输入各个旗子的分值*/
for(i=0;i<n;++i) scanf("%d",&mark[i]);

/*初始化*/
memset(ts,0,sizeof(ts));
memset(work,0,sizeof(work));
for(i=0;i<MAXL;++i) work[i][1]=-1;
res=0;

/*数组work[][0]记录的是:
如果一定要经过第i面旗子,则将一定经过第i面旗子所能达到的最优值记录在work[i][0]
work[][1]记录的是:
对于第i面旗子,达到最优值需要经过的前一面旗子的编号,如果该面旗是第1面旗,即前面没有满足条件的旗子,则将它记录为-1*/

/*动态规划核心部分*/
for(i=0;i<n;++i)
{
for(j=0;j<i;j++)