日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HOJ-2662Pieces Assignment(状态压缩,动态规划)

發布時間:2025/3/15 编程问答 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HOJ-2662Pieces Assignment(状态压缩,动态规划) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Pieces Assignment
Source : zhouguyue
Time limit : 1 sec Memory limit : 64 M
Submitted : 415, Accepted : 149
Background
有一個n*m的棋盤(n、m≤80,n*m≤80)要在棋盤上放k(k≤20)個棋子,使得任意兩個棋子不相鄰(每個棋子最多和周圍4個棋子相鄰)。求合法的方案總數。
Input
本題有多組測試數據,每組輸入包含三個正整數n,m和k。
Output
對于每組輸入,輸出只有一個正整數,即合法的方案數。
Sample Input
2 2 3
4 4 1
Sample Output
0
16
簡單dp題,動態規劃就是這樣,你要自己去理解,真的要別人告訴你這個原理是什么,是又麻煩,又沒有效果的。每個人都是從不會到會,不會看別人博客,但是請一定要獨立思考,學習動態規劃更是要這樣。自己的體會對自己來說總是最有用的
狀態轉移方程:dp[i][j][p]+=dp[i-1][v][p-t];

#include <iostream> #include <string.h> #include <math.h> #include <algorithm> #include <stdlib.h>using namespace std; long long int dp[85][1<<10][25];//在第i行,棋子為k個,狀態為s的狀態數 int n,m,k; int getsum(int x) {int res=0;int i=0;while(x){if(res&&(x&1))return -1;if(res=(x&1))i++;x>>=1;}return i; } int main() {while(scanf("%d%d%d",&n,&m,&k)!=EOF){//根據n,m的大小確定行和列if(n<m)swap(n,m);memset(dp,0,sizeof(dp));dp[0][0][0]=1;int end=(1<<m)-1;for(int i=1;i<=n;i++){for(int p=0;p<=k;p++){for(int j=0;j<=end;j++){int t=getsum(j);if(t==-1||t>p)continue;for(int v=0;v<=end;v++){if(getsum(v)==-1||(v&j))continue;dp[i][j][p]+=dp[i-1][v][p-t];}}}}long long int sum=0;for(int i=0;i<=end;i++)sum+=dp[n][i][k];printf("%lld\n",sum);}

轉載于:https://www.cnblogs.com/dacc123/p/8228856.html

總結

以上是生活随笔為你收集整理的HOJ-2662Pieces Assignment(状态压缩,动态规划)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。