codeforces 505B B. Mr. Kitayuta's Colorful Graph-爆搜/DP
来源:互联网 发布:买到淘宝假货怎么投诉 编辑:程序博客网 时间:2024/05/24 06:35
题意:给十种秤砣,重量为1~10,个数无限,给n,问能否进行n次左右交替摆放秤砣,
满足以下规则:
每次放下一个秤砣后,该边重量必须大于另一边
并且这次放下的秤砣不能和上一次放下的秤砣种类相同。。。
这题居然爆搜也能过。估计是可行的答案分支比较多。。。
DP【k】【i】【j】表示 第k次摆放时,所选择摆放的那一边比另一边 重 i ,并且第k次选择的是重量为j的秤砣
初始化 for (i=1;i<=10;i++)
{
if (!vis[i]) continue;
dp[1][i][i]=1;
}
for (k=2;k<=n;k++){for (i=1;i<=10;i++){for (j=i;j<=10;j++){if (!vis[j]) continue;if (dp[k-1][i][j])<span style="white-space:pre"></span>//如果上一次该情况存在{for (h=i+1;h<=10;h++)//看第k次能放哪个{if (!vis[h]) continue;<span style="white-space:pre"></span>//存在if (h==j) continue;<span style="white-space:pre"></span>//不能与上一次相同dp[k][h-i][h]=1;out[k][h-i][h]=j;<span style="white-space:pre"></span>//记录上一个秤砣的重量,一会回溯打印}}}}}DP:
#include <cstdio>#include <cmath>#include <cstring>#include <string>#include <algorithm>#include <queue>#include <map>#include <set>#include <vector>#include <iostream>using namespace std;const double pi=acos(-1.0);double eps=0.000001; int n;int vis[15];char str[15]; int dp[1005][15][15];int ans[1005];int ok=0;int out[1005][15][15];void print(int k,int i,int j){if (k!=1)print(k-1,j-i,out[k][i][j]); printf("%d ",j);}int main(){int i,j,k,h;scanf("%s",str+1);for (i=1;i<=10;i++){if (str[i]=='1')vis[i]=1;}cin>>n;for (i=1;i<=10;i++){if (!vis[i]) continue;dp[1][i][i]=1;}for (k=2;k<=n;k++){for (i=1;i<=10;i++){for (j=i;j<=10;j++){if (!vis[j]) continue;if (dp[k-1][i][j]){for (h=i+1;h<=10;h++){if (!vis[h]) continue;if (h==j) continue;dp[k][h-i][h]=1;out[k][h-i][h]=j;}}}}} for (i=1;i<=10;i++){for (j=1;j<=10;j++){if (dp[n][i][j]){ printf("YES\n");print(n,i,j);printf("\n");return 0;}}}printf("NO\n"); return 0;}
爆搜:
#include <cstdio>#include <cmath>#include <cstring>#include <string>#include <algorithm>#include <queue>#include <map>#include <set>#include <vector>#include <iostream>using namespace std;const double pi=acos(-1.0);double eps=0.000001; int n;int vis[15];char str[15];int ans[1005];int ok=0;int l=0;int r=0;int last=0;int dfs( int compare,int cun){if (cun==n+1) return 1; int tmp=last;for (int i=1;i<=10;i++){if (!vis[i]) continue;if (last!=i&& i>compare){last=i;if (dfs(i-compare,cun+1)){ans[cun]=i;return 1;}last=tmp; }} return 0;}int main(){scanf("%s",str+1);int i;for (i=1;i<=10;i++){if (str[i]=='1')vis[i]=1;}cin>>n;if (dfs(0,1)){printf("YES\n");for (i=1;i<=n;i++){printf("%d ",ans[i]);}printf("\n");}elseprintf("NO\n");return 0;}
0 0
- codeforces 505B B. Mr. Kitayuta's Colorful Graph-爆搜/DP
- codeforces 505B B. Mr. Kitayuta's Colorful Graph(bfs)
- Codeforces 505B - Mr. Kitayuta's Colorful Graph (DFS)
- CodeForces-505B-Mr. Kitayuta's Colorful Graph(弗洛伊德)
- codeforces 505B Mr. Kitayuta's Colorful Graph
- codeforces 505B Mr. Kitayuta's Colorful Graph
- B. Mr. Kitayuta's Colorful Graph
- B - Mr. Kitayuta's Colorful Graph
- CF 505B Mr. Kitayuta's Colorful Graph(最短路)
- Codeforces 505B. Mr. Kitayuta's Colorful Graph 并查集
- 【种类并查集】codeforces 505B Mr. Kitayuta's Colorful Graph
- Codeforces 505B __Mr. Kitayuta's Colorful Graph(floyd)
- CF div.2B. Mr. Kitayuta's Colorful Graph
- cf#286-B - Mr. Kitayuta's Colorful Graph-dfs
- B. Mr. Kitayuta's Colorful Graph(并查集)
- Codeforces Round #286 (Div. 2)B. Mr. Kitayuta's Colorful Graph
- Codeforces Round #286 (Div. 2) B. Mr. Kitayuta's Colorful Graph
- Codeforces Round #286 (Div. 2) B. Mr. Kitayuta's Colorful Graph +foyd算法的应用
- Hadoop编程调用HDFS
- 并查集
- proftpd复杂权限的设置
- [Java] 作业2答疑
- Java经典设计模式之五大创建型模式(附实例和详解)
- codeforces 505B B. Mr. Kitayuta's Colorful Graph-爆搜/DP
- Spring4.1新特性——Spring MVC增强
- Android 实现个性的ViewPager切换动画 实战PageTransformer(兼容Android3.0以下)
- 编程实现strcpy函数功能(非库函数)
- 沉浸式状态栏源码分析
- 我理解的希尔排序
- linux消息队列
- iOS个人整理29-JSON与xml文件解析
- android如何隐藏头部的标题栏全屏显示