日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

算法训练 最大的算式

發布時間:2025/7/25 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法训练 最大的算式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
算法訓練 最大的算式 ? 時間限制:1.0s ? 內存限制:256.0MB 問題描述 題目很簡單,給出N個數字,不改變它們的相對位置,在中間加入K個乘號和N-K-1個加號,(括號隨便加)使最終結果盡量大。因為乘號和加號一共就是N-1個了,所以恰好每兩個相鄰數字之間都有一個符號。例如:
  N=5,K=2,5個數字分別為1、2、3、4、5,可以加成:
  1*2*(3+4+5)=24
  1*(2+3)*(4+5)=45
  (1*2+3)*(4+5)=45
  …… 輸入格式 輸入文件共有二行,第一行為兩個有空格隔開的整數,表示N和K,其中(2<=N<=15, 0<=K<=N-1)。第二行為 N個用空格隔開的數字(每個數字在0到9之間)。 輸出格式 輸出文件僅一行包含一個整數,表示要求的最大的結果 樣例輸入 5 2
1 2 3 4 5 樣例輸出 120 樣例說明 (1+2+3)*4*5=120 好像正解使用動態規劃,我用遞歸做的,但有一組測試數據沒通過。。。 #include <iostream> #include <cstdio> #include <vector> #include <queue> #include <cstring> #include <algorithm> #include <cstdlib> #include <map> #define for(i,x,n) for(int i=x;i<n;i++) #define ll long long int #define INF 0x3f3f3f3f #define MOD 1000000007using namespace std;int a[15];//0為*,1為+ int num[15]; int m[15];//待乘 int n,k; int maxx=0;int sum(){int i=0;if(a[1]==0){m[i++]=num[0];m[i]=num[1];for(j,2,n){if(a[j]==1){m[i]+=num[j];}if(a[j]==0){m[++i]=num[j];}}int ans=1;for(j,0,i+1){ans*=m[j];}return ans;}if(a[1]==1){m[i]=num[0];m[i]+=num[1];for(j,2,n){if(a[j]==1){m[i]+=num[j];}if(a[j]==0){m[++i]=num[j];}}int ans=1;for(j,0,i+1){ans*=m[j];}return ans;}}void dfs(int pos,int mul,int add){if(pos==n&&mul==0&&add==0){maxx=max(maxx,sum());}else if(pos!=n){if(mul>0&&add==0){a[pos]=0;dfs(pos+1,mul-1,add);}if(mul==0&&add>0){a[pos]=1;dfs(pos+1,mul,add-1);}if(mul>0&&add>0){a[pos]=0;dfs(pos+1,mul-1,add);a[pos]=1;dfs(pos+1,mul,add-1);}} }int main() {scanf("%d %d",&n,&k);for(i,0,n){scanf("%d",&num[i]);}dfs(1,k,n-k-1);//放的位置,乘號剩余,加號剩余printf("%d",maxx);return 0; }

?更新:

#include <iostream> #include <cstdio> #include <vector> #include <queue> #include <cstring> #include <algorithm> #include <cstdlib> #include <map> #define for(i,x,n) for(int i=x;i<n;i++) #define ll long long int #define INF 0x3f3f3f3f #define MOD 1000000007using namespace std;int a[15];//0為*,1為+ ll num[15]; ll m[15];//待乘 ll n,k; ll maxx=0;ll sum(){int i=0;if(a[1]==0){m[i++]=num[0];m[i]=num[1];for(j,2,n){if(a[j]==1){m[i]+=num[j];}if(a[j]==0){m[++i]=num[j];}}ll ans=1;for(j,0,i+1){ans*=m[j];}return ans;}if(a[1]==1){m[i]=num[0];m[i]+=num[1];for(j,2,n){if(a[j]==1){m[i]+=num[j];}if(a[j]==0){m[++i]=num[j];}}ll ans=1;for(j,0,i+1){ans*=m[j];}return ans;}}void dfs(int pos,int mul,int add){if(pos==n&&mul==0&&add==0){if(maxx<sum()){maxx=sum();}//maxx=max(maxx,sum());}else if(pos!=n){if(mul>0&&add==0){a[pos]=0;dfs(pos+1,mul-1,add);}if(mul==0&&add>0){a[pos]=1;dfs(pos+1,mul,add-1);}if(mul>0&&add>0){a[pos]=0;dfs(pos+1,mul-1,add);a[pos]=1;dfs(pos+1,mul,add-1);}} }int main() {scanf("%d %d",&n,&k);for(i,0,n){scanf("%d",&num[i]);}dfs(1,k,n-k-1);//放的位置,乘號剩余,加號剩余printf("%lld",maxx);return 0; }

?

轉載于:https://www.cnblogs.com/TWS-YIFEI/p/6351623.html

總結

以上是生活随笔為你收集整理的算法训练 最大的算式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。