AtCoder Beginner Contest 122 D - We Like AGC (DP)
D - We Like AGC
Time Limit: 2 sec / Memory Limit: 1024 MB
Score : 400400 points
Problem Statement
You are given an integer NN. Find the number of strings of length NN that satisfy the following conditions, modulo 109+7109+7:
- The string does not contain characters other than
A
,C
,G
andT
. - The string does not contain
AGC
as a substring. - The condition above cannot be violated by swapping two adjacent characters once.
Notes
A substring of a string TT is a string obtained by removing zero or more characters from the beginning and the end of TT.
For example, the substrings of ATCODER
include TCO
, AT
, CODER
, ATCODER
and (the empty string), but not
AC
.
Constraints
- 3≤N≤1003≤N≤100
Input
Input is given from Standard Input in the following format:
NN
Output
Print the number of strings of length NN that satisfy the following conditions, modulo 109+7109+7.
Sample Input 1 Copy
3
Sample Output 1 Copy
61
There are 43=6443=64 strings of length 33 that do not contain characters other than A
, C
, G
and T
. Among them, only AGC
, ACG
and GAC
violate the condition, so the answer is 64−3=6164−3=61.
Sample Input 2 Copy
4
Sample Output 2 Copy
230
Sample Input 3 Copy
100
Sample Output 3 Copy
388130742
Be sure to print the number of strings modulo 109+7109+7.
题意:
给你一个数字N,N的范围是3~100
让你求出有多少种可能的字符串,使之只包括这四种字符 A
, C
, G
and T
.
并且字符串不含有“AGC”这个子串,并且仅交换一次相邻的字符也不含有“AGC”这个子串。
思路:
我们根据第一个样例就可以看出N=3的所有情况。
因为我们考虑的是DP的写法,先思考如何定义状态,
我们通过思考可以知道我们从N=3转到N=4的状态的时候,我们要考虑整个字符串的后3个字符才可以确定最后一位能不能加上我们在转移的字符,
那么我们不妨在定义状态的时候就把整个字符串的后3位字符都存下来。
所以我们定义状态如下:
DP[ len ][i] [ j ] [ k ] = 长度为len的字符串中,后三位字符串依次是ijk的字符串有多少种。
这里因为只有四种字母,我们不妨给四个字符进行用数码编号表示,以此来简化我们的程序编写;
我们按照字典序把{'A','C','G','T'}; 编为 0 1 2 3.
那么我们现在从N=4开始考虑,
我们知道以下几种情况是不能满足条件的
后三位是 我们不能接上
*AG C
*AC G
*GA C
A*G C
AG* C
我们只需要在转移的时候,把这5种会产生不符合条件的字符串给删除掉(即不计入计数)
就可以顺利的推出答案了。
具体转移的细节见代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <iomanip>
#define ALL(x) (x).begin(), (x).end()
#define rt return
#define dll(x) scanf("%I64d",&x)
#define xll(x) printf("%I64d\n",x)
#define sz(a) int(a.size())
#define all(a) a.begin(), a.end()
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define pii pair<int,int>
#define pll pair<long long ,long long>
#define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define MS0(X) memset((X), 0, sizeof((X)))
#define MSC0(X) memset((X), '\0', sizeof((X)))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define eps 1e-6
#define gg(x) getInt(&x)
#define db(x) cout<<"== [ "<<x<<" ] =="<<endl;
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
ll powmod(ll a,ll b,ll MOD){ll ans=;while(b){if(b%)ans=ans*a%MOD;a=a*a%MOD;b/=;}return ans;}
inline void getInt(int* p);
const int maxn=;
const int inf=0x3f3f3f3f;
/*** TEMPLATE CODE * * STARTS HERE ***/
int n;
const ll mod = 1e9+7ll;
ll dp[][][][];
char c[]={'A','C','G','T'};
int main()
{
//freopen("D:\\common_text\\code_stream\\in.txt","r",stdin);
//freopen("D:\\common_text\\code_stream\\out.txt","w",stdout);
// gbtb*/
cin>>n;
string temp="";
int num=;
// repd(i,0,3)
// {
// temp[0]=c[i];
// repd(j,0,3)
// {
// temp[1]=c[j];
// repd(k,0,3)
// {
// temp[2]=c[k];
// cout<<num++<<" ";
// cout<<temp<<endl;
// }
// }
// }
// char c[6]={'A','C','G','T'};
repd(i,,)
{
repd(j,,)
{
repd(k,,)
{
dp[][i][j][k]=;
}
}
}
dp[][][][]=;
dp[][][][]=;
dp[][][][]=;
ll cnt=0ll;
repd(len,,n)
{
repd(i,,)
{
repd(j,,)
{
repd(k,,)
{
cnt=0ll; repd(ii,,)
{
repd(jj,,)
{
repd(kk,,)
{
//{'A','C','G','T'};
if(jj==i&&kk==j)
{
if(k==&&kk==&&jj==)
{ }else if(k==&&kk==&&jj==)
{ }else if(k==&&kk==&&jj==)
{ }else if(k==&&kk==&&ii==)
{ }else if(k==&&jj==&&ii==)
{ }else
{
cnt+=dp[len-][ii][jj][kk];
cnt=(cnt+mod)%mod;
}
} }
}
}
cnt=(cnt+mod)%mod;
dp[len][i][j][k]=cnt;
// printf("%d %d %d %lld\n",i,j,k,cnt);
}
}
}
}
ll ans=0ll;
repd(i,,)
{
repd(j,,)
{
repd(k,,)
{
ans+=dp[n][i][j][k];
ans=(ans+mod)%mod;
} }
}
cout<<ans<<endl;
return ;
} inline void getInt(int* p) {
char ch;
do {
ch = getchar();
} while (ch == ' ' || ch == '\n');
if (ch == '-') {
*p = -(getchar() - '');
while ((ch = getchar()) >= '' && ch <= '') {
*p = *p * - ch + '';
}
}
else {
*p = ch - '';
while ((ch = getchar()) >= '' && ch <= '') {
*p = *p * + ch - '';
}
}
}
AtCoder Beginner Contest 122 D - We Like AGC (DP)的更多相关文章
- AtCoder Beginner Contest 122 D - We Like AGC(DP)
题目链接 思路自西瓜and大佬博客:https://www.cnblogs.com/henry-1202/p/10590327.html#_label3 数据范围小 可直接dp f[i][j][a][ ...
- Atcoder Grand Contest 030 F - Permutation and Minimum(DP)
洛谷题面传送门 & Atcoder 题面传送门 12 天以前做的题了,到现在才补/yun 做了一晚上+一早上终于 AC 了,写篇题解纪念一下 首先考虑如果全是 \(-1\) 怎么处理.由于我 ...
- Atcoder Grand Contest 024 E - Sequence Growing Hard(dp+思维)
题目传送门 典型的 Atcoder 风格的计数 dp. 题目可以转化为每次在序列中插入一个 \([1,k]\) 的数,共操作 \(n\) 次,满足后一个序列的字典序严格大于前一个序列,问有多少种操作序 ...
- AtCoder Beginner Contest 122 解题报告
手速选手成功混进rated only里面的前30名,但是总排名就到110+了... A - Double Helix #include <bits/stdc++.h> #define ll ...
- [题解] Atcoder Beginner Contest ABC 265 Ex No-capture Lance Game DP,二维FFT
题目 首先明确先手的棋子是往左走的,将其称为棋子1:后手的棋子是往右走的,将其称为棋子2. 如果有一些行满足1在2右边,也就是面对面,那其实就是一个nim,每一行都是一堆石子,数量是两个棋子之间的空格 ...
- Atcoder Grand Contest 010 C - Cleaning 树贪心(伪)
C - Cleaning 题目连接: http://agc010.contest.atcoder.jp/tasks/agc010_c Description There is a tree with ...
- Atcoder Grand Contest 001 D - Arrays and Palindrome(构造)
Atcoder 题面传送门 洛谷题面传送门 又是道思维题,又是道把我搞自闭的题. 首先考虑对于固定的 \(a_1,a_2,\dots,a_n;b_1,b_2,\dots,b_m\) 怎样判定是否合法, ...
- Atcoder Regular Contest 096 C - Everything on It(组合数学)
Atcoder 题面传送门 & 洛谷题面传送门 简单题,由于这场 arc 的 F 是 jxd 作业而我不会做,所以只好来把这场的 E 水掉了. 我们记 \(f(i)\) 为钦定 \(i\) 个 ...
- Atcoder Grand Contest 034 F - RNG and XOR(FWT)
Atcoder 题面传送门 & 洛谷题面传送门 tsc 考试前 A 的题了,结果到现在才写这篇题解--为了 2mol 我已经一周没碰键盘了,现在 2mol 结束算是可以短暂的春天 短暂地卷一会 ...
随机推荐
- 自动化测试基础篇--Selenium发送测试报告邮件
来自:https://www.cnblogs.com/sanzangTst/p/8377870.html 发邮件需要用到python两个模块,smtplib和email,这俩模块是python自带的, ...
- C# DBHelper类 参考
using System;using System.Collections.Generic;using System.Text;using System.Configuration;using Sys ...
- c/c++ 编译器提供的默认6个函数
c/c++ 编译器提供的默认6个函数 1,构造函数 2,拷贝构造函数 3,析构函数 4,=重载函数 5,&重载函数 6,const&重载函数 #include <iostream ...
- 思科4506E做ehterchannel故障排查
思科4506E做ehterchannel故障排查 转载于:https://blog.51cto.com/eric1026/1910912 一.故障描述 某客户有两台4506E汇聚交换机,需要做ethe ...
- LeetCode算法题-Climbing Stairs(Java实现)
这是悦乐书的第159次更新,第161篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第18题(顺位题号是70).你正在爬楼梯,它需要n步才能达到顶峰.每次你可以爬1或2步, ...
- May 31. 2018 Week 22nd Thursday
The good seaman is known in bad weather. 惊涛骇浪,方显英雄本色. As we all know, the true worth of a person is ...
- [福大软工] Z班 第12次成绩排行榜
注:本次成绩排行榜是针对结对项目二的点评分数 作业要求 http://www.cnblogs.com/easteast/p/7604534.html 评分细则 (1)有贴生成得最"好&quo ...
- Java多线程(三)如何创建线程
点我跳过黑哥的卑鄙广告行为,进入正文. Java多线程系列更新中~ 正式篇: Java多线程(一) 什么是线程 Java多线程(二)关于多线程的CPU密集型和IO密集型这件事 Java多线程(三)如何 ...
- 【JXOI2018】守卫
[JXOI2018]守卫 参考题解:https://blog.csdn.net/dofypxy/article/details/80196942 大致思路就是:区间DP.对于\([l,r]\)的答案, ...
- Pandas 处理丢失数据
处理丢失数据 import pandas as pd from pandas import Series, DataFrame import numpy as np 有两种丢失数据: 1. None ...