生活随笔
收集整理的這篇文章主要介紹了
HDU 6078 Wavel Sequence(dp)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Description
定義波浪序列:a1 > a2 < a3…,現在給出一個長度為n的序列a和一個長度為m的序列b,求a和b的公共波浪子序列個數
Input
第一行一整數T表示用例組數,每組用例首先輸入兩個整數n和b表示兩個序列的長度,然后輸入一個長度為n的序列a[1]~a[n]和一個長度為m的序列b[1]~b[m] (1<=T<=15,1<=n,m,a[i],b[j]<=2000)
Output
輸出a和b的公共波浪子序列個數
Sample Input
1
3 5
1 5 3
4 1 1 5 3
Sample Output
10
Solution
Code
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=
2001,mod=
998244353;
namespace fastIO
{
#define BUF_SIZE 100000bool IOerror=
0;
inline char nc() {
static char buf[BUF_SIZE],*p1=buf+BUF_SIZE,*pend=buf+BUF_SIZE;
if(p1==pend) {p1=buf;pend=buf+fread(buf,
1,BUF_SIZE,stdin);
if(pend==p1) {IOerror=
1;
return -
1;}}
return *p1++;}
inline bool blank(
char ch) {
return ch==
' '||ch==
'\n'||ch==
'\r'||ch==
'\t';}
inline void read(
int &x) {
char ch;
while(blank(ch=nc()));
if(IOerror)
return;
for(x=ch-
'0';(ch=nc())>=
'0'&&ch<=
'9';x=x*
10+ch-
'0');}
#undef BUF_SIZE
};
using namespace fastIO;
int T,n,m,a[maxn],b[maxn],dp[maxn][
2],sum[maxn][
2];
int inc(
int x,
int y)
{
return x+y>=mod?x+y-mod:x+y;
}
int main()
{read(T);
while(T--){read(n),read(m);
for(
int i=
1;i<=n;i++)read(a[i]);
for(
int i=
1;i<=m;i++)read(b[i]);
memset(sum,
0,
sizeof(sum));
int ans=
0;
for(
int i=
1;i<=n;i++){
int num0=
0,num1=
1;
for(
int j=
1;j<=m;j++){dp[j][
0]=dp[j][
1]=
0;
if(a[i]==b[j]){dp[j][
0]=num1,dp[j][
1]=num0;ans=inc(ans,inc(num0,num1)); }
else if(a[i]<b[j])num1=inc(num1,sum[j][
1]);
else num0=inc(num0,sum[j][
0]);}
for(
int j=
1;j<=m;j++)sum[j][
0]=inc(sum[j][
0],dp[j][
0]),sum[j][
1]=inc(sum[j][
1],dp[j][
1]);}
printf(
"%d\n",ans);}
return 0;
}
總結
以上是生活随笔為你收集整理的HDU 6078 Wavel Sequence(dp)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。