4 3 9 1 1 2 6 3 9 1 2 3 3 5 2 3 1 1 1 1 1 9 9 9 1 2 3 4 5 6 7 8 9
1 0 10 60
题意:给出n个人的id,有两个门,每一个门有一个标号,我们记作a和b,如今我们要将n个人分成两组。进入两个门中,使得两部分人的标号的和(迭代的求,直至变成一位数)各自等于a和b,问有多少种分法,(能够全部的人进入一个门)。
pt = j - p[i];
状态转移方程: dp[i][j] = dp[i-1][j] + dp[i-1][pt];
两种处理方法:
一
#include<iostream> #include<algorithm> #include<stdio.h> #include<string.h> #include<stdlib.h> using namespace std; const int N = 100001; const int mod = 258280327; int dp[N][10]; int n,a,b; int p[N]; int num(int xx,int yy) { int t = xx + yy; if(t%9 == 0) { return 9; } return t%9; } int pnum(int xx,int yy) { int tt = xx - yy; if(tt%9 == 0) { return 9; } if(tt%9<0) { return 9+(tt%9); } return tt%9; } int main() { int T; scanf("%d",&T); while(T--) { int sum = 0; scanf("%d%d%d",&n,&a,&b); for(int i=1;i<=n;i++) { scanf("%d",&p[i]); sum = num(sum,p[i]); } memset(dp,0,sizeof(dp)); dp[0][0] = 1; for(int i=1;i<=n;i++) { for(int j=0;j<=9;j++) { dp[i][j] += dp[i-1][j]; dp[i][j] = dp[i][j]%mod; int pt = pnum(j,p[i]); if(pt == 9) { dp[i][j] += max(dp[i-1][0],dp[i-1][9]); } else { dp[i][j] += dp[i-1][pnum(j,p[i])]; } dp[i][j] = dp[i][j]%mod; } } int ans = 0; if(num(a,b) == sum) { ans = dp[n][a]; if(a == sum) { ans--; } } if(a == sum) { ans++; } if(b == sum) { ans++; } printf("%d\n",ans); } return 0; }
二
#include<iostream> #include<algorithm> #include<stdio.h> #include<string.h> #include<stdlib.h> using namespace std; const int N = 100001; const int mod = 258280327; int dp[N][10]; int n,a,b; int p[N]; int num(int xx,int yy) { int t = xx + yy; if(t%9 == 0) { return 9; } return t%9; } int main() { int T; scanf("%d",&T); while(T--) { int sum = 0; scanf("%d%d%d",&n,&a,&b); for(int i=1;i<=n;i++) { scanf("%d",&p[i]); sum = num(sum,p[i]); } memset(dp,0,sizeof(dp)); dp[0][0] = 1; for(int i=1;i<=n;i++) { for(int j=0;j<=9;j++) { int pt = num(j,p[i]); dp[i][j]+=dp[i-1][j]; dp[i][pt]+=dp[i-1][j]; dp[i][j]%=mod; dp[i][pt]%=mod; } } int ans = 0; if(num(a,b) == sum) { ans = dp[n][a]; if(a == sum) { ans--; } } if(a == sum) { ans++; } if(b == sum) { ans++; } printf("%d\n",ans); } return 0; }
HDU 5389 Zero Escape(DP + 滚动数组)
原文:http://www.cnblogs.com/claireyuancy/p/6934782.html