题意:给出2段只由数字跟问号组成的字符串,问号的位置上可以放入任意数字,问有多少种放入方法,使得存在一对i,j,使得a[i] > b[i] && a[j] < b[j].
磨了2小时,在结束前A掉了,开心。
思路 : dp[i][5] ,1 - 4分别代表 在前i个数字所有组合中:a 中所有数字大于或参杂了等于 b 的组合数 ;a中所有数字等于b的组合数;a中所有数字小于或者参杂了等于b的组合数;同时存在a[i] > b[i] && a[j] < b[j]的组合数,即所求。
#include<iostream>
#include<map>
#include<vector>
#include<string>
#include<algorithm>
#include<stdio.h>
#include<cstring>
#include<set>
#include<cmath>
#include<functional>
#include<queue>
using namespace std;
#define inf 0x7ffffff
#define LL long long
#define N 100005
#define MOD 1000000007
char a[N],b[N];
LL dp[N][5];//大中小,混
int main()
{
LL i,j,k;
LL n;
while(cin>>n)
{
scanf("%s%s",&a[1],&b[1]);
memset(dp,0,sizeof(dp));
for(i = 1;i <= n;i++)
{
if(a[i] == '?')
{
if(b[i] == '?')
{
dp[i][1] = (55*(dp[i - 1][1]) + 45*(dp[i - 1][2]))%MOD;
dp[i][2] = (10*dp[i - 1][2])%MOD;
dp[i][3] = (55*(dp[i - 1][3]) + 45*(dp[i - 1][2]))%MOD;
dp[i][4] = (45*dp[i - 1][3] + 45*dp[i - 1][1] + 100*dp[i - 1][4])%MOD;
if(dp[i][1] + 0 + dp[i][3] + dp[i][2] + dp[i][4] == 0)
{
dp[i][1] = 45;
dp[i][3] = 45;
dp[i][2] = 10;
}
}
else
{
LL up = '9' - b[i];
LL dowm = b[i] - '0';
dp[i][1] = (up*(dp[i - 1][1] + dp[i - 1][2]) + dp[i - 1][1])%MOD;
dp[i][2] = dp[i - 1][2];
dp[i][3] = (dowm*(dp[i - 1][3] + dp[i - 1][2]) + dp[i - 1][3])%MOD;
dp[i][4] = (up*dp[i - 1][3] + dowm*dp[i - 1][1] + 10*dp[i - 1][4])%MOD;
if(dp[i][1] + 0 + dp[i][3] + dp[i][2] + dp[i][4] == 0)
{
dp[i][1] = up;
dp[i][3] = dowm;
dp[i][2] = 1;
}
}
}
else
{
if(b[i] == '?')
{
LL up = a[i] - '0';
LL dowm = '9' - a[i];
dp[i][1] = (up*(dp[i - 1][1] + dp[i - 1][2]) + dp[i - 1][1])%MOD;
dp[i][2] = dp[i - 1][2];
dp[i][3] = (dowm*(dp[i - 1][3] + dp[i - 1][2]) + dp[i - 1][3])%MOD;
dp[i][4] = (up*dp[i - 1][3] + dowm*dp[i - 1][1] + 10*dp[i - 1][4])%MOD;
if(dp[i][1] + 0 + dp[i][3] + dp[i][2] + dp[i][4] == 0)
{
dp[i][1] = up;
dp[i][3] = dowm;
dp[i][2] = 1;
}
}
else
{
if(a[i] > b[i])
{
dp[i][1] = (dp[i - 1][1] + dp[i - 1][2])%MOD;
dp[i][4] = (dp[i - 1][3] + dp[i - 1][4])%MOD;
if(dp[i][1] + 0 + dp[i][3] + dp[i][2] + dp[i][4] == 0)
dp[i][1] = 1;
}
else if(a[i] == b[i])
{
dp[i][1] = dp[i - 1][1];
dp[i][2] = dp[i - 1][2];
dp[i][3] = dp[i - 1][3];
dp[i][4] = dp[i - 1][4];
if(dp[i][1] + 0 + dp[i][3] + dp[i][2] + dp[i][4] == 0)
dp[i][2] = 1;
}
else
{
dp[i][3] = (dp[i - 1][3] + dp[i - 1][2])%MOD;
dp[i][4] = (dp[i - 1][1] + dp[i - 1][4])%MOD;
if(dp[i][1] + 0 + dp[i][3] + dp[i][2] + dp[i][4] == 0)
dp[i][3] = 1;
}
}
}
// cout<<dp[i][1]<<' '<<dp[i][2]<<' '<<dp[i][3]<<' '<<dp[i][4]<<endl;
}
cout<<dp[n][4]<<endl;
}
return 0;
}