dp、interval dp、線分ツリー、ツリーのような配列を記憶し、演習を収集します。
間隔dp:
1。石がマージされます
2.パスワードが落ちます
ユニオンチェックセット:
1。マージセット
2.接続されたブロック内のポイント数
3.食物連鎖
4.村の電気(最小全域木)
記憶されたdp:
1。スキー
2.マトリックス内の最長の増分パス
ツリー配列、線分ツリー:
0。サブマトリックスプレフィックスと
1。プレフィックスと
2。連続間隔を動的に検索します
。2。星を数えます。
2018年第9回ブルーブリッジカップJavaプログラミング学部グループBの個々の問題解決策の概要決勝:
問題2
タイトル:最大の製品
1から9までの9つの数字を2つのグループに分け、中央に乗算記号を挿入します。
場合によっては、それらの積には1から9までの9つの数字しか含まれず、各数字は1回しか表示されません。
例:
984672 * 351 = 345619872
98751 * 3462 = 341875962
9 * 87146325 = 784316925
…
このルールに準拠した計算式はたくさんありますが、これらすべての式の中で最大の製品はどれですか?
提出する必要があるのは整数であり、最大の製品を表すことに注意してください。余分なコンテンツは入力しないでください。
(製品のみを提出し、計算全体を提出しないでください)
フルアレンジ
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<string>
#include<cmath>
#include<set>
#include<algorithm>
#include<sstream>
using namespace std;
int a[9]={
1,2,3,4,5,6,7,8,9};
int t[9];
long long rrrr;
int l_range,r_range;
int main(){
do{
for(int i=0;i<=7;i++){
int ln=i+1,rn=9-ln;
long long rl=0;
long long rr=0;
long long rres=0;
string s;
string s1,s2;
for(int j=0;j<=i;j++){
stringstream sb;
sb<<a[j];
s1+=sb.str();
}
for(int k=i+1;k<=8;k++){
stringstream sb;
sb<<a[k];
s2+=sb.str();
}
stringstream sa1,sa2;
sa1<<s1;
sa1>>rl;
sa2<<s2;
sa2>>rr;
rres=rl*rr;
stringstream ssb;
ssb<<rres;
s=ssb.str();
set<char> st;
int flag=0;
for(int u=0;u<s.size();u++){
if(s[u]=='0'){
flag=1;
break;
}
st.insert(s[u]);
}
if(flag){
continue;
}
if(st.size()==s.size() && rres>rrrr){
l_range=rl;
r_range=rr;
for(int i=0;i<=8;i++){
t[i]=a[i];
}
rrrr=rres;
}
}
}while(next_permutation(a,a+9));
cout<<"??1:"<<l_range<<endl;
cout<<"??2:"<<r_range<<endl;
cout<<"结果:"<<rrrr<<endl;
cout<<endl;
return 0;
}