HDU 5389 Zero Escape(2015年多校聯合第八場 動態規劃)
題目連線:傳送門
題意:
講一個長度為n的序列分為兩組,使得一組的和為A,一組的和為B.
注意這裡的和定義為這些數的和的數根。
一個數的數根的計算公式為,root = (x-1)%9+1;
很明顯一個正整數的數根是1~9的分析,如果這n個數的數根分成兩組使得
一組的數根為A,一組的數根為B那麼這兩組的數的和的數根等於(A+B)的
數根。因此我們只需要考慮組成其中一個數的情況,然後再最後進行一個
判斷即可我們設dp[i][j]表示前i個陣列成的數根為j的數目。
注意其中任意一組可以為空。
程式碼如下:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long LL;
const LL mod = 258280327;
const int maxn = 1e5+10;
LL dp[2][10];
int a[maxn];
int main()
{
int t,A,B,n;
scanf("%d",&t);
while(t--){
scanf("%d%d%d",&n,&A,&B);
int sum=0;
for(int i=1;i<=n;i++){
scanf("%d",a+i);
sum=(sum+a[i]-1)%9+1;
}
int cur=0;
memset(dp,0,sizeof(dp));
dp[0][0]=1;
for(int i=1;i<=n;i++){
cur^=1;
memset(dp[cur],0,sizeof(dp[cur]));
for(int j=0;j<10;j++){
dp[cur][j]=(dp[cur][j]+dp[cur^1][j])%mod;
int t = (j+a[i]-1)%9+1;
dp[cur][t]=(dp[cur][t]+dp[cur^1][j])%mod;
}
}
int tot = (A+B-1)%9+1;
LL ans = 0;
if(tot == sum){
ans=dp[cur][A];
if(A==sum) ans--;
}
if(A==sum) ans++;
if(B==sum) ans++;
printf("%I64d\n",ans);
}
return 0;
}
相關文章
- HDU 5375 Gray code(2015年多校聯合 動態規劃)動態規劃
- hdu5289||2015多校聯合第一場1002貪心+RMQMQ
- HDU4689Derangement (動態規劃)動態規劃
- 動態規劃位置hdu 4540 威威貓系列故事——打地鼠(動態規劃)動態規劃
- 動態規劃 hdu 1260 Tickets動態規劃
- 動態規劃 hdu 1421 搬寢室動態規劃
- 動態規劃 hdu 1500 Chopsticks動態規劃
- 動態規劃 hdu 1978 How many ways動態規劃
- hdu 1176 免費餡餅(動態規劃)動態規劃
- hdu1074動態規劃狀態壓縮動態規劃
- HDU5831(2016多校第八場)———Rikka with Parenthesis II(水題)
- 陳老師的多校聯合20140816A題||spoj 10228 動態規劃動態規劃
- hdu5336 多校聯合第四場1010 模擬+bfs優先佇列佇列
- 2014多校聯合第9場1011題||hdu 4970 樹狀陣列陣列
- 【動態規劃(一)】動態規劃基礎動態規劃
- 動態規劃-硬幣組合數目動態規劃
- 2014多校聯合第9場1006||hdu 4965 矩陣乘法和快速冪矩陣
- 動態規劃動態規劃
- 2014多校聯合第十場A題||hdu 4971 最小割定理在最大權閉合圖上的應用
- 動態規劃-最少硬幣組合問題動態規劃
- 動態規劃入門——動態規劃與資料結構的結合,在樹上做DP動態規劃資料結構
- 動態規劃分析動態規劃
- 動態規劃(DP)動態規劃
- 動態規劃初步動態規劃
- 模板 - 動態規劃動態規劃
- 動態規劃法動態規劃
- 暑假第八週規劃
- 【USACO 2015 Open Gold】Palindromic Paths 動態規劃Go動態規劃
- 演算法系列-動態規劃(1):初識動態規劃演算法動態規劃
- 淺談動態規劃動態規劃
- 有關動態規劃動態規劃
- 動態規劃小結動態規劃
- 動態規劃初級動態規劃
- 動態規劃講義動態規劃
- 好題——動態規劃動態規劃
- 3.動態規劃動態規劃
- 動態規劃-----線性動態規劃
- 動態規劃專題動態規劃