关于一个算法问题希望有程序方面的人给个算法

关于一个算法问题希望有程序方面的人给个算法,第1张

两个循环:

for (i=1; i<=10; i++) // 最多时10个菜

for (j=1; j<i; j++)

// 从10个菜中取j个,(就是组合10取j),用函数做,把取出的菜放到一个数组里。

// 计算j个菜的总额

// 判断总额==356

#include <stdioh>

char dict[]={

"bland",

"blank",

"bleak",

"bleed",

"blend",

"blind",

"blink",

"blond",

"blood",

"bloom",

"blown",

"blows",

"brand",

"brank",

"bread",

"break",

"bream",

"breed",

"brown",

"clank",

"clink",

"dread",

"dream"

};

#define MAX_DICT 23

checkin(char input){

int i;

for(i=0;i<MAX_DICT;i++)

{

if(strcmp(input,dict[i])==0)return i;

}

return -1;

}

getNext(char input,int count,int indexes[])

{

int i,j,len,dest,k,cc;

char new[100];

len=strlen(input);

for(i=0;i<len;i++)

{

strcpy(new,input);

for(j=0;j<26;j++)

{

new[i]='a'+j;

cc=0;

for(k=0;k<count;k++){

if(strcmp(dict[indexes[k]],new)==0){

cc=1;

break;

}

}

if(cc==1)continue;//已经变换过

dest=checkin(new);

if(dest>=0)return dest;//找到可以变换的词

}

}

return -1;//没有可以变换的词

}

main(){

char input[100],new[100],output[100],road[1024];

int index,i,j,dest,count,indexes[MAX_DICT];

strcpy(input,"");

while(strcpy(input,"quit")!=0)

{

printf("请输入变换字符串:");

scanf("%s",input);

if(strcmp(input,"quit")==0)break;

printf("请输入目标字符串:");

scanf("%s",output);

if(strcmp(output,"quit")==0)break;

index=checkin(output);

if(index<0){

printf("%s 不在字典里!\n",output);

continue;

}

index=checkin(input);

if(index<0){

printf("%s 不在字典里!\n",input);

continue;

}

strcpy(road,"");

strcpy(new,input);

count=0;

indexes[count]=index;

count++;

while(1)

{

dest=-1;

dest=getNext(new,count,indexes);

if(dest<0){

printf("不存在变换系列\n");

break;

}

else if(strcmp(dict[dest],output)==0){//找到目标字符串

printf("%s,%s%s\n",input,road,output);

break;

}

else{//变换过程,如果成功变换则输出

strcat(road,dict[dest]);

strcat(road,",");

strcpy(new,dict[dest]);

indexes[count]=dest;

count++;

}

}

}

}

动态规划法(DP)

k[i]存储以s[i]结尾的最长升序子串在s[i]前面的长度(即以s[i]结尾的最长升序子串长度-1);

k[i]初值为0;(s[i]是长度为1的升序子串)

计算k[i]时,遍历j=0,1,,i-1,若满足以下2个条件:

1 s[j] <= s[i],(以s[j]结尾的升序子串后面接上s[i]仍然是升序子串)

2 k[j]+1 > k[i],(以s[j]结尾的最长升序子串接上s[i]后,长度大于已知的以s[i]结尾最长升序子串)

就用k[j]+1更新k[i]

计算过程中用m记录遇到的k[i]的最大值,则计算结束时m+1即为最长升序子串长度。

以上就是关于关于一个算法问题希望有程序方面的人给个算法全部的内容,包括:关于一个算法问题希望有程序方面的人给个算法、C语言程序算法、求大神分析此程序中的算法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/zz/10072376.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-04
下一篇2023-05-04

发表评论

登录后才能评论

评论列表(0条)

    保存