信奥赛一本通1573:分离与合体C++分离与合体
2024-08-28 11:07:36
题目链接
#include<cstdio>
#include<algorithm>
using namespace std;
int dp[305][305]={},jojo[305][305];
int t,kk;
int a[305];
void DFS(int x,int y,int toto){ //x左标记,y为右标记,toto表示目前你回溯到的层次
if(x>=y) //左标记在右标记右边,自然不成立 (剪枝)
return ;
if(toto==kk){// 如果你回溯到了kk的层次,那么就可以输出啦!
printf("%d ",jojo[x][y]);
t=1; //确保下次还进循环;
return ;
}
DFS(x,jojo[x][y],toto+1);
DFS(jojo[x][y]+1,y,toto+1);
}
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
for(int i=n-1;i>0;i--){
for(int j=i+1;j<=n;j++){
for(int k=i;k<j;k++){
if(dp[i][j]<dp[i][k]+dp[k+1][j]+(a[i]+a[j])*a[k]){
dp[i][j]=dp[i][k]+dp[k+1][j]+(a[i]+a[j])*a[k]; //合并时获得的价值就是 ( 1号金钥匙价值 +2号金钥匙价值)* 3号金钥匙价值。
jojo[i][j]=k; //标记,方便后来回溯找输出队列;
}
}
}
}
printf("%d\n",dp[1][n]);
//开始回溯(开始吟唱!!!)
t=1; //确保进入循环
while(t){
t=0; //先将t的初值赋为0 ,如果找到了回溯的数,t就重新回1,如果t为零,那么回溯就完成了;
kk++;
DFS(1,n,1);
}
return 0;
}
最新文章
- 上个项目的一些反思 III
- mysql 定时任务
- 没想到cnblog也有月经贴,其实C#值不值钱不重要。
- TCP UDP 协议的区别和联系
- mybatis 入门二
- 一个功能齐全的IOS音乐播放器应用源码
- 递归小demo(1-100的和)
- swift 关于闭包和函数
- CRC32校验的用法
- PHP定义静态方法的原则
- 读书笔记 effective c++ Item 44 将与模板参数无关的代码抽离出来
- Mac os下安装brew
- 算法提高 拿糖果 线性DP
- Docker Demo on Docker
- Atlas实现MySQL大表部署读写分离
- C#复习笔记(5)--C#5:简化的异步编程(异步编程的深入分析)
- 今天讲座的感悟--java
- AngularJS中的transclusion案例
- CentOS 6和CentOS 7防火墙的关闭
- SpringBoot(十)_springboot集成Redis
热门文章
- shell中 -eq,-ne,-gt,-lt,-ge,-le数字比较符
- SPI总线 通俗易懂讲解——(转载)
- 2020-1-19 2.港股打新、REITs和分拆
- 简单读读源码 - dubbo多提供者(provider)配置方法
- 『动善时』JMeter基础 — 24、JMeter中使用“用户参数”实现参数化
- 【C++】禁用/启用笔记本键盘工具(含源码)
- GO语言面向对象08---投胎游戏
- C# 移除字符串头尾指定字符
- 怎样训练YOLOv3
- Kaggle上的犬种识别(ImageNet Dogs)