记忆化dp ,区间dp , 线段树, 树状数组, 并查集练习题。
并查集:
1.合并集合
2.连通块中点的数量
3.食物链
4.村庄通电(最小生成树)
记忆化dp:
1.滑雪
2.矩阵中的最长递增路径
树状数组,线段树:
0.子矩阵前缀和
1.前缀和
2.动态求连续区间和
2.数星星
2018年第九届蓝桥杯Java程序设计本科B组决赛个人题解汇总:
第二题
标题:最大乘积
把 1~9 这9个数字分成两组,中间插入乘号,
有的时候,它们的乘积也只包含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;
}