2539 最优填充2 (相邻不同字母最少系列——求最优解方案数)

2539 最优填充2

字符串ss只包含两种字符A,BA,B,已知它某些位上的字符,你想要把它填

充完整使得相同字母相邻的情况尽量少,问有多少种最优填充方案。答案对1e9+7取模。

输入

第一行两个数n,m,表示字符串长度,已知位置数。
第二行m个数pos[i];
第三行一个长度为m的字符串val[i],表示s[pos[i]]=val[i]。
保证pos[i]两两不同。
n<=10^9,m<=50,1<=pos[i]<=n,val[i]='A'or'B'。

输出

一个数,表示最优方案数,答案对1e9+7取模。

输入样例

3 2
1 3

25 15
23 4 8 1 24 9 16 17 6 2 25 15 14 7 13
ABBBBABABBAAABA

305 28
183 115 250 1 188 193 163 221 144 191 92 192 58 215 157 187 227 177 206 15 272 232 49 11 178 59 189 246    
ABAABBABBAABABBBBAAAABBABBBA

输出样例

2
1
43068480

思路:

      之前做过构造这种序列,思路很清晰,这题唯一注意的话就是

两位置之间一定有字母相同,那方案数不是乘以2,应该是乘以区间

内数字数目减一。详见代码。

代码实现:

#include<iostream>
#include<cstring>
#include<cmath>
#include<set>
#include<map>
#include<cstdio>
#include<algorithm>
#define LL long long
#define INF 0x3f3f3f3f
using namespace std;
const int N=2e5+100;
const int M=6e3+100;
const  int mod=1e9+7;
struct Node {
  int pos;
  char val;
} arr[N];
bool cmp(Node aa,Node bb) {
  return aa.pos<bb.pos;
}
int main() {
#ifdef MYHOME
  freopen("input.txt","r",stdin);
#endif
  int n,m,ans;
  while(cin>>n>>m) {
    ans=1;
    for(int i=1; i<=m; i++) {
      cin>>arr[i].pos;
    }
    for(int i=1; i<=m; i++) {
      cin>>arr[i].val;
    }
    sort(arr+1,arr+1+m,cmp);
    for(int i=2; i<=m; i++) {
      if(((arr[i].pos-arr[i-1].pos)%2==0)&&arr[i].val!=arr[i-1].val) {
        ans=((LL)ans*(LL)(arr[i].pos-arr[i-1].pos))%mod;
      } else if(((arr[i].pos-arr[i-1].pos)%2==1)&&arr[i].val==arr[i-1].val) {
        ans=((LL)ans*(LL)(arr[i].pos-arr[i-1].pos))%mod;
      }
    }
    cout<<ans<<endl;
  }
  return 0;
}

THE END;

木箱填充集装箱是一个NP困难问题,而Python是一种高级编程语言,具有强大的计算和算法处理能力。因此,可以使用Python来计算木箱填充集装箱的最优解。 首先,我们需要定义木箱和集装箱的尺寸,并建立一个适当的据结构来表示它们。可以使用Python中的类来表示木箱和集装箱,并定义它们的属性,如长度、宽度、高度等。 接下来,通过使用适当的算法和据结构,可以将木箱填充到集装箱中。可以使用深度优先搜索、贪婪算法或者动态规划算法等来实现填充过程。通过计算每个木箱在集装箱中的位置和方向,可以找到最优填充路径。 在填充过程中,可以使用Python中的循环和条件语句来判断木箱是否可以放置在集装箱中的某个位置。通过计算木箱的剩余空间或与其他木箱的重叠程度,可以决定是否选择当前放置方案,或者尝试其他可行的方案。 最后,通过对各种可能的填充方案进行比较和评估,可以确定最优填充方法。可以定义评估函来计算填充方案的效率和优劣,并选择具有最小剩余空间、最小重叠程度、最大填充率等特征的方案作为最优解。 总而言之,利用Python的计算和算法处理能力,可以实现木箱填充集装箱的最优解。通过定义适当的据结构和算法,以及比较和评估不同填充方案,可以找到最佳的填充方法,从而提高填充效率和减少资源浪费。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值