HDU Equal Sentences (2020杭电多校训练第四场1005)
HDU Equal Sentences
根据题目,不难发现有一下的规律:
第i个和前一个比较,如果相等,就赋值为i-1的值
否则就dp[i-1]+dp[i-2]+1
存到第i就是有dp[i]+1个解
if(a[i]==a[i-1])
dp[i]=dp[i-1];
else
dp[i]=(dp[i-1]+dp[i-2]+1)%mod;
这边在多说一句,string的格式还是需要用cin去读取,scanf好像不行…
其他的废话不多说直接上AC代码
#include <bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<b;i++)
#define T int t ;cin >> t;while(t--)
using namespace std ;
typedef long long ll;
typedef unsigned long long ull;
inline ll gcd(ll a,ll b){return b == 0? a:gcd(b, a % b);}
const int maxn = 1e5+10;
const int INF = 0x3f3f3f3f;
const double eps = 1e-11;
const ll mod = 1e9 + 7;
ll n ;
string a[maxn] ;
ll dp[maxn] ;
int main()
{
T
{
cin >> n ;
ll ans = 0 ;
memset(dp,0,sizeof(dp)) ; //清空dp数组
for(int i = 1 ; i <= n ; i++)
{
cin >> a[i] ;
}
dp[0] =0 ;dp[1] = 0 ;
for(int i=2;i<=n;i++)
{
if(a[i]==a[i-1])
dp[i]=dp[i-1];
else
dp[i]=(dp[i-1]+dp[i-2]+1)%mod;
}
printf("%lld\n",dp[n]+1) ;
}
return 0 ;
}