week12 选做题 D E

D

题目描述


在这里插入图片描述

样例

Sample Input
((()))
()()()
([]])
)[)(
([][][)
end
Sample Output
6
6
4
0
6

思路分析

区间DP,找到最长的合法子序列的长度。

数组dp[i][j]表示区间[i,j]中最长合法子序列的长度,初始化为0。

除空序列外,还有两种合法构造。

  1. 若S合法,则(S)和[S]合法,即左右两端为()或[],合法长度加2。dp[i][j]=dp[i+1][j-1]+2;

  2. 若A,B合法,则AB合法。
    dp[i][j]=max(dp[i][j],dp[i][k]+dp[k][j]);

嵌套for循环,从长度为2,i=0的子序列开始,将i不断增大(向尾部移动),长度增长,更新当前子序列的最长合法长度。
最终答案为dp[0][str.size()-1]。

AC代码

#include<iostream>
#include<string.h>
#include<algorithm>
#include<string>
using namespace std; 
int dp[105][105];
int main()
{
 string str;
 while(cin>>str)
 {
  if(str=="end") return 0; 
  memset(dp,0,sizeof(dp));
  for(int len=2;len<=str.size();len++)
  {
   for(int i=0;i<str.size();i++)
   {
    int j=i+len-1;
    if(j>=str.size())  break;
    if(str[i]=='('&&str[j]==')'||str[i]=='['&&str[j]==']')
    {
     dp[i][j]=dp[i+1][j-1]+2;
    }
    int k=i; 
    while(k<j)
             {
                 dp[i][j]=max(dp[i][j],dp[i][k]+dp[k][j]);
                 k++;
             }
   } 
  }
  cout<<dp[0][str.size()-1]<<endl; 
 }
    return 0;
}

E

题目描述

马上假期就要结束了,zjm还有 n 个作业,完成某个作业需要一定的时间,而且每个作业有一个截止时间,若超过截止时间,一天就要扣一分。

zjm想知道如何安排做作业,使得扣的分数最少。

Tips: 如果开始做某个作业,就必须把这个作业做完了,才能做下一个作业。
Input
有多组测试数据。第一行一个整数表示测试数据的组数

第一行一个整数 n(1<=n<=15)

接下来n行,每行一个字符串(长度不超过100) S 表示任务的名称和两个整数 D 和 C,分别表示任务的截止时间和完成任务需要的天数。

这 n 个任务是按照字符串的字典序从小到大给出。
Output
每组测试数据,输出最少扣的分数,并输出完成作业的方案,如果有多个方案,输出字典序最小的一个。

样例

Sample Input
2
3
Computer 3 3
English 20 1
Math 3 2
3
Computer 3 3
English 6 3
Math 6 3
Sample Output
2
Computer
Math
English
3
Computer
English
Math

在第二个样例中,按照 Computer->English->Math 和 Computer->Math->English 的顺序完成作业,所扣的分数都是 3,由于 English 的字典序比 Math 小,故输出前一种方案。

思路分析

状压DP+位运算

结构体HW存放任务名称name,截至时间d和需要天数c。

dp[S]表示完成S作业集合后被扣的最少分数。

转移方程:dp[S|(1<<x)]= dp[S]+作业x被扣的分数temp

temp的计算方法:

sum=S作业集合对应总时间

temp=max((sum+tasks[x].c-tasks[x].d),0);

用数组pre[S]记录每个状态对应的最后一个作业,在输出时从后向前递归的输出。

AC代码

#include<iostream>
#include<string>
#include<string.h>
#include<cmath>
using namespace std;
const int Max=1e9;
struct HW
{
 string name;
 int d,c;
};
HW tasks[20];
int dp[50000],pre[50000],sum[50000];
void output(int x)
{
 if(x==0) return;
 output(x-(1<<pre[x]));
 cout<<tasks[pre[x]].name<<endl;
}
int main()
{
 int num;
 cin>>num;
 while(num--)
 {
  int n;
  cin>>n;
  memset(dp,0,sizeof(dp));
  memset(pre,0,sizeof(pre));
  memset(sum,0,sizeof(sum));
  for(int i=0;i<n;i++)
  {
   cin>>tasks[i].name>>tasks[i].d>>tasks[i].c;
  }
  for(int i=1;i<=(1<<n);i++)
  {
   dp[i]=Max;
   for(int j=n-1;j>=0;j--)
   {
    if(i&(1<<j))
    {
     int k=i-(1<<j);
     int temp=max((sum[k]+tasks[j].c-tasks[j].d),0);
     if(dp[i]>dp[k]+temp)
     {
         dp[i]=dp[k]+temp;
      pre[i]=j;
      sum[i]=sum[k]+tasks[j].c;
     }
    } 
   }
  }
  cout<<dp[(1<<n)-1]<<endl;
  output((1<<n)-1);
 }
 return 0;
} 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
代码下载:完整代码,可直接运行 ;运行版本:2022a或2019b或2014a;若运行有问题,可私信博主; **仿真咨询 1 各类智能优化算法改进及应用** 生产调度、经济调度、装配线调度、充电优化、车间调度、发车优化、水库调度、三维装箱、物流选址、货位优化、公交排班优化、充电桩布局优化、车间布局优化、集装箱船配载优化、水泵组合优化、解医疗资源分配优化、设施布局优化、可视域基站和无人机选址优化 **2 机器学习和深度学习方面** 卷积神经网络(CNN)、LSTM、支持向量机(SVM)、最小二乘支持向量机(LSSVM)、极限学习机(ELM)、核极限学习机(KELM)、BP、RBF、宽度学习、DBN、RF、RBF、DELM、XGBOOST、TCN实现风电预测、光伏预测、电池寿命预测、辐射源识别、交通流预测、负荷预测、股价预测、PM2.5浓度预测、电池健康状态预测、水体光学参数反演、NLOS信号识别、地铁停车精准预测、变压器故障诊断 **3 图像处理方面** 图像识别、图像分割、图像检测、图像隐藏、图像配准、图像拼接、图像融合、图像增强、图像压缩感知 **4 路径规划方面** 旅行商问题(TSP)、车辆路径问题(VRP、MVRP、CVRP、VRPTW等)、无人机三维路径规划、无人机协同、无人机编队、机器人路径规划、栅格地图路径规划、多式联运运输问题、车辆协同无人机路径规划、天线线性阵列分布优化、车间布局优化 **5 无人机应用方面** 无人机路径规划、无人机控制、无人机编队、无人机协同、无人机任务分配 **6 无线传感器定位及布局方面** 传感器部署优化、通信协议优化、路由优化、目标定位优化、Dv-Hop定位优化、Leach协议优化、WSN覆盖优化、组播优化、RSSI定位优化 **7 信号处理方面** 信号识别、信号加密、信号去噪、信号增强、雷达信号处理、信号水印嵌入提取、肌电信号、脑电信号、信号配时优化 **8 电力系统方面** 微电网优化、无功优化、配电网重构、储能配置 **9 元胞自动机方面** 交通流 人群疏散 病毒扩散 晶体生长 **10 雷达方面** 卡尔曼滤波跟踪、航迹关联、航迹融合

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rwyoi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值