营销型网站建设题库,深圳优化公司踏高粱seo,沈阳网站设计运营公司,淘宝建设网站的目的是什么意思这道题除了非常恶心以外也没有什么非常让人恶心的地方 当然一定要说有的话还是有的#xff0c;就是这题和咱 ZJOI 的 mahjong 真的是好像的说~ 于是就想说这道题出题人应该被 锕 掉 noteskey 整体的思路就是特判国士无双和七对子#xff0c;然后 dp 搞普通的胡牌 dp 状态设计…这道题除了非常恶心以外也没有什么非常让人恶心的地方 当然一定要说有的话还是有的就是这题和咱 ZJOI 的 mahjong 真的是好像的说~ 于是就想说这道题出题人应该被 锕 掉 noteskey 整体的思路就是特判国士无双和七对子然后 dp 搞普通的胡牌 dp 状态设计和楼上大佬说的一样就是用一个五维的 \(f[i][j][k][l][p]\) 表示当前处理了前 i 种类型的牌存在 j 个 面子/杠子 以 i-1 开头的顺子要选 k 个以 i 开头的面子要选 l 个以及当前是否有 雀头 (用 p 表示) 然后转移就非常的暴力了反正这里的数据范围也比较小枚举下状态转移就好了 总的来说就是道 语文 码农 dp 题虽说没什么思维难度但我不见得能想出来 watch out 这题的字符串读入还是比较毒瘤的...要稍微注意一下不然可能会出事 code 这压行是同样的味道呢~ //by Judge
#includebits/stdc.h
#define Rg register
#define fp(i,a,b) for(Rg int i(a),I(b)1;iI;i)
#define ll long long
using namespace std;
#ifndef Judge
#define getchar() (p1p2(p2(p1buf)fread(buf,1,121,stdin),p1p2)?EOF:*p1)
#endif
char buf[121],*p1buf,*p2buf;
inline bool cmax(ll a,ll b){return ab?ab,1:0;}
inline int read(){ int x0,f1; char cgetchar();for(;!isdigit(c);cgetchar()) if(c-) f-1;for(;isdigit(c);cgetchar()) xx*10c-0; return x*f;
} inline void reads(string s){ char cgetchar();for(;!isalpha(c)!isdigit(c);cgetchar()); s;for(;isalpha(c)||isdigit(c);cgetchar()) sc;
} char sr[121],z[20];int CCF-1,Z;
inline void Ot(){fwrite(sr,1,CCF1,stdout),CCF-1;}
inline void print(ll x,char chr\n){if(CCF120)Ot();if(x0)sr[CCF]45,x-x;while(z[Z]x%1048,x/10);while(sr[CCF]z[Z],--Z);sr[CCF]chr;
} int t,cnt,a[41],b[41],C[5][5]; ll f[41][5][3][3][2],tp[41];
int gs[14]{0,1,9,10,18,19,27,28,29,30,31,32,33,34}; string c;
inline int id(){ if(c[0]B) return 34;if(c[0]E) return 28; if(c[0]S) return 29; if(c[0]W) return 30;if(c[0]N) return 31; if(c[0]Z) return 32; if(c[0]F) return 33;if(c[1]m) return c[0]-48; if(c[1]p) return c[0]-39; return c[0]-30;
}
int main(){ C[0][0]1;fp(i,1,4){ C[i][0]1;fp(j,1,i) C[i][j]C[i-1][j-1]C[i-1][j];}fp(T,1,read()){memset(a,0,sizeof a);memset(b,0,sizeof b);memset(f,0,sizeof f);while(1){ reads(c);if(c[0]0) break;else a[id()];}while(1){ reads(c);if(c[0]0) break;else b[id()]1;}fp(i,1,34) a[i]4-a[i];ll ans0;fp(i,1,13){ ll tmp1; //枚举出现两次的牌 fp(j,1,13) //枚举 13 种牌 if(ij)if(a[gs[j]]2) tmp0; //如果数量不够就让 tmp0 else tmp*C[a[gs[j]]][2]*(b[gs[j]]?4:1); //否则加贡献 elseif(a[gs[j]]1) tmp0;else tmp*C[a[gs[j]]][1]*(b[gs[j]]?2:1);cmax(ans,tmp*13);}cnt0;fp(i,1,34) if(a[i]2) tp[cnt]C[a[i]][2]*(b[i]?4:1);if(cnt7){ //如果牌数大于等于 2 的不止 7 张就可以构成七对子 sort(tp1,tp1cnt); ll tmp1; //选出权最大的 7 种牌 fp(i,cnt-6,cnt) tmp*tp[i]; //累乘贡献 cmax(ans,tmp*7);}f[0][0][0][0][0]1; //初始化边界 fp(i,0,33) fp(j,0,4) for(Rg int k0;k3jk4;k){if(k1(i9||i18||i27)) break; //不合法开头无法构成顺子 for(Rg int l0;l3jkl4;l){if(l1(i9||i18||i27)) break;if(f[i][j][k][l][0]||f[i][j][k][l][1]) fp(u,kl,a[i1]){ll tmpC[a[i1]][u]*(b[i1]?(1u):1); //计算贡献 // 四种转移 if(ju4u-k-l3) cmax(f[i1][jk][l][u-k-l][0],f[i][j][k][l][0]*tmp),cmax(f[i1][jk][l][u-k-l][1],f[i][j][k][l][1]*tmp);if(u-k-l-20ju-24)cmax(f[i1][jk][l][u-k-l-2][1],f[i][j][k][l][0]*tmp);if(u-k-l-30ju-24)cmax(f[i1][jk1][l][u-k-l-3][0],f[i][j][k][l][0]*tmp),cmax(f[i1][jk1][l][u-k-l-3][1],f[i][j][k][l][1]*tmp);if(u4!k!lj3)cmax(f[i1][j1][0][0][0],f[i][j][k][l][0]*tmp),cmax(f[i1][j1][0][0][1],f[i][j][k][l][1]*tmp);}}}cmax(ans,f[34][4][0][0][1]),print(ans);} return Ot(),0;
} 转载于:https://www.cnblogs.com/Judge/p/10749200.html