官方題解:
a-小d的劇場
大概意思就是,有1~49個數,代表著不同的音符,問你能組成長度為n的串有多少種(mod 109+7)。有若干個限制,比如1 2 3,就是1,2,3不能放在一起,然後問你在這些限制下有多少種不同的長度為n的串。
3≤n≤500,0≤q≤117649,1≤a,b,c≤49
思路
看到這題,想到hdu2047,不難想到dp的方法,就是乙個暴力的dp題。dp[i][j][k]代表長度為i,第i個位置為j,第i-1個位置為k的種數,狀態轉移方程為:dp[i][j][k]+=dp[i-1][k][l],預處理好vis[j][k][l]是否能放在一起。
**
#includeusing namespace std;
typedef long long ll;
const ll mod=1e9+7;
ll n,q;
ll a,b,c;
ll vis[50][50][50];
ll dp[510][50][50];
int main()s[maxn];
bool cmp(node i,node j)edges[maxn*2];
ll head[maxn],ecnt;
void init()
void add(ll from,ll to,ll w)
void dfs(ll root,ll pra)
if(dp[son][0]+edges[i].w > dp[root][1]) dp[root][1]=dp[son][0]+edges[i].w;}}
ans=max(ans,dp[root][0]+dp[root][1]);
}int main()
ans=-1;
dfs(1,0);
printf("%lld\n",sum*2-ans);
}
牛客練習賽40
題目鏈結 c題 小a與尤拉路 先考慮迴路的情況。由於是一棵樹,任兩點間路徑只有一條,從一條邊走到深度更大的點,一定還會從同一條邊返回以回到起點或者遍歷其他子樹,所以每條邊需要複製一次,此時答案是邊權和的兩倍。不是迴路的情況可以減掉從終點回到起點的路徑,要讓這條路徑盡量長,所以長度一定是直徑的長度。答...
牛客練習賽22題解
簡單瞎搞題 不會用bitset,所以沒做出來。實際上還是比較簡單的。include using namespace std bitset 1000005 dp 2 int main cout 2 count 簡單資料結構1 這裡要運用拓展尤拉定理。ab modp ab p b p p 0 modp ...
題解 牛客練習賽51
字首a的數量,字尾c的數量,遇到b就計算一次答案。includeusing namespace std typedef long long ll const int n 1e5 100 char s n int cnt n int main int tmp 0 for int i 1 i n i p...