swjtu oj 1579 加號問題

2021-06-04 18:58:48 字數 1583 閱讀 2946

明顯的dp演算法。方便起見,定義乙個結構體answer。用來儲存乙個字串數字,當然拉,也可以不用,看個人喜好。輸入字串s ,加號個數 m,乙個answer的二維陣列 opt[ i ][ j ] ,表示: 用 s 的前 i 的 字元,在這i個字元中加入 j 個加號 ,所求的最小得和。

首先,opt[ 0 ][ i ] = 0. 表示,取a中的 0個字元 ,加入i 個加號,得到的數,自然是0 .

opt[ i ][ 0 ]=a[ 0....i-1 ] ,表示 ,取a中的前i個字元 ,加入0個加號,很明顯,得到的數為

a[0..i-1].

因此,得到以下公式:

opt[ n ][ m ] = min

迴圈計算opt[ n ][ m ];

n=strlen(n);

為 opt [   i ] [ 0 ] , opt [ 0 ] [ j ] 賦初值(i=0,1,2,...n) (j=0,1,2.....m);

for i 1 to n

for j 1 to m

計算 opt[ i ][ j ] (按照以上公式)

輸出 opt[ n ][ m ]

演算法就這麼簡單,但是關於實現,首先,必須寫乙個字串相加的函式,由於位數的關係,所有加法都必須基於字串,其次,乙個字串數字比較的函式,不能用strcmp.

#include #include typedef struct answer;

answer opt[201][21]; //opt[i][j],??s????????i????????????j??????????????????????

char *plus(char *a , char *b,int p,int i)

else

sign=0;

} while(m'9')

else

sign=0;m++;}

while(m'9')

else

sign=0;m++;}

if(sum[0]=='0'&&sign==1) sum[0]='1';

sum[length]='\0';

if(sum[0]=='0')

return sum+1;

else

return sum;

}void fun(char *s,int m);

int asmaller(char *a,char *b)

return 0;

} char *plus(char *a , char *b,int p,int i);

int main()

return 0;

}void get(char *a,char *s,int i)

char min[250]; char sum[250];

strcpy(sum,plus(opt[i-1][j-1].s,s,i-1,i-1));

strcpy(min,sum);

int p;

for(p=i-2;p>=0;p--)

strcpy(opt[i][j].s,min);

}printf("%s\n",opt[ls]­.s);

}

157 掃瞄器使用

雙面影印,上面朝向自己為影印的上方!安裝驅動程式 colornetworkscangear v271 win zh setup.exe 安裝完成後,對照說明檔案進行配置,下面擷取 windows 7 的部分。對於 windows 7 1 單擊 開始 指向 控制面板 然後依次單擊 系統和安全 wind...

1 5 7 Python匿名函式

1.匿名函式的核心 一些簡單的需要用函式去解決的問題,匿名函式的函式體只有一行 2.引數可以有多個,用逗號隔開 3.返回值和正常的函式一樣可以是任意的資料型別 請把下面的函式轉換成匿名函式 def add x,y return x y add 結果 sum1 lambda x,y x y print...

157 判斷數字是否回文

題目如下 判斷乙個整數是否是回文數。回文數是指正序 從左向右 和倒序 從右向左 讀都是一樣的整數。示例 1 輸入 121 輸出 true 示例 2 輸入 121 輸出 false 解釋 從左向右讀,為 121 從右向左讀,為 121 因此它不是乙個回文數。解題思路 1 如果x是負數或者x是最低位為0...