✅ 状态压缩动态规划
This commit is contained in:
		
							
								
								
									
										64
									
								
								state-compress-dp/main.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								state-compress-dp/main.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,64 @@ | ||||
| #include <iostream> | ||||
| #include <vector> | ||||
|  | ||||
| using namespace std; | ||||
|  | ||||
| int m, n; | ||||
| int obstacle[101]; | ||||
| int dp[101][1025]; | ||||
|  | ||||
| const int MOD_FACTOR = 100000007; | ||||
|  | ||||
| vector<int> state; | ||||
|  | ||||
| void init_state() { | ||||
|     state.push_back(0); | ||||
|     for (int i = 0; i < (1 << n); i++) { | ||||
|         if (!(i & i << 1)) { | ||||
|             state.push_back(i); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| void calculate() { | ||||
|     for (int j = 1; j < state.size(); j++) { | ||||
|         if (!(state[j] & obstacle[1])) { // Check overlap | ||||
|             dp[1][j] = 1; | ||||
|         } | ||||
|     } | ||||
|     for (int i = 2; i <= m; i++) { | ||||
|         for (int j = 1; j < state.size(); j++) { | ||||
|             if (!(state[j] & obstacle[i])) { // Check obstacle overlap | ||||
|                 for (int k = 1; k < state.size(); k++) { | ||||
|                     if (!(state[j] & state[k])) { // Check overlap | ||||
|                         dp[i][j] = (dp[i][j] + dp[i - 1][k]) % MOD_FACTOR; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| int main() { | ||||
|     cin >> m >> n; | ||||
|     for (int i = 1; i <= m; i++) { | ||||
|         obstacle[i] = 0; | ||||
|         int num; | ||||
|         for (int j = 1; j <= n; j++) { | ||||
|             cin >> num; | ||||
|             if (num == 0) { | ||||
|                 obstacle[i] += (1 << (n - j)); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     init_state(); | ||||
|     calculate(); | ||||
|     int ans = 0; | ||||
|     for (int j = 1; j < state.size(); j++) { | ||||
|         ans = (ans + dp[m][j]) % MOD_FACTOR; | ||||
|     } | ||||
|     cout << ans - 1 << endl; | ||||
|     return 0; | ||||
| } | ||||
		Reference in New Issue
	
	Block a user