1. 程式人生 > >演算法第三章上機實驗

演算法第三章上機實驗

演算法第三章上機實驗

數字三角形

給定一個由 n行數字組成的數字三角形如下圖所示。試設計一個演算法,計算出從三角形 的頂至底的一條路徑(每一步可沿左斜線向下或右斜線向下),使該路徑經過的數字總和最大。

#include <iostream>

using namespace std;

int maxsum(int a[100][100],int n){

int b[100][100]={0};

for(int i=n-1;i>=0;i--){

for(int j=i;j>=0;j--){

b[i][j]=((b[i+1][j]<b[i+1][j+1])?b[i+1][j+1]:b[i+1][j])+a[i][j];

}

}

return b[0][0];

}

 

int main(){

int n;

int a[100][100];

cin>>n;

for(int i=0;i<n;i++){

for(int j=0;j<=i;j++){

cin>>a[i][j];

}

}

cout<<maxsum(a,n);

return 0;

}

 

 

最大子段和

#include<iostream>

using namespace std;

int getmax(int c[],int n){

int b[10];

b[0]=c[0];

for(int i =1;i<n;i++){

if(b[i-1]>0){

b[i]=b[i-1]+c[i];

}

else b[i]=c[i];

}

int max=b[0];

for(int i =1;i<n;i++){

if(b[i]>max) max=b[i];

}

return max;

}

int main(){

int c[10],n,flag=0;

cin>>n;

for(int i=0;i<n;i++){

cin>>c[i];

if (c[i]<0){

flag++;

}

}

if(flag==n){

cout<<0;

}

else{

int max = getmax(c,n);

cout<<max;}

return 0;

}

 

 

編輯距離問題

#include <iostream>

#include <stdio.h>

#include <cstring>

using namespace std;

int main(){

char a[2005],b[2005];

cin>>(a+1);

cin>>(b+1);

int n, m;

n = strlen(a+1);

m = strlen(b+1);

int **s=new int*[n+1];

for(int i=0;i<=n;i++)  s[i]=new int[m+1];

for(int i=0;i<=n; i++){

s[i][0]=i;  

}

    for(int j = 0;j<= m; j++){

     s[0][j] = j;

    }

for(int i=1;i<=n;i++)  

    {  

        for(int j=1;j<=m;j++)  

        {

if(a[i]==b[j]){

s[i][j] = s[i-1][j-1];

}else{

s[i][j] = min(min(s[i-1][j]+1,s[i][j-1]+1),s[i-1][j-1]+1);  

}  

        }  

    }

    printf("%d",s[n][m]);