10118 - Free Candies
来源:互联网 发布:js 为什么会跨域 编辑:程序博客网 时间:2024/06/04 00:37
动态规划问题。设f[i][j][k][l]表示篮子放第一堆i、第二堆j、第三堆k、第四堆l个蛋糕所剩的最少的蛋糕,状态转移方程有4个:f[i + 1][j][k][l] = min(f[i +1][j][k][l], max(0, f[i][j][k][l] - 1));( f[i][j][k][l] < 5 && num[digit[i+ 1][0]] & 1 && i < n),表示若当前篮子还能放蛋糕,我们从第一堆再拿一个,若在篮子中有这个颜色蛋糕并且为奇数,则f[i][j][k][l]篮子蛋糕减1更新f[i +1][j][k][l]。num[]表示当前f[i][j][k][l]这个状态各个蛋糕的个数。同理可写出其他3个。程序中num[]用的比较巧妙,根据变量更新,减少了存储空间,节省了时间。程序效率跑到了第10,很意外^-^
#include <iostream>#include <cstdio>#include <cstring>using namespace std;int digit[41][5], f[41][41][41][41];int num[41];int main(){ freopen("input.txt", "r", stdin); int n, d; int ans; while(scanf("%d", &n) == 1 && n){ for(int i = 1; i <= n; i++) scanf("%d %d %d %d", &digit[i][0], &digit[i][1], &digit[i][2], &digit[i][3]); memset(num, 0, sizeof(num)); ans = 0; for(int i = 0; i <= n; i++) for(int j = 0; j <= n; j++) for(int k = 0; k <= n; k++) for(int l = 0; l <= n; l++) f[i][j][k][l] = 10; f[0][0][0][0] = 0; for(int i = 0; i <= n; i++){ if(i) num[digit[i][0]]++; for(int j = 0; j <= n; j++){ if(j) num[digit[j][1]]++; for(int k = 0; k <= n; k++){ if(k) num[digit[k][2]]++; for(int l = 0; l <= n; l++){ if(l) num[digit[l][3]]++; if(f[i][j][k][l] < 5){ ans = max(ans, (i + j + k + l - f[i][j][k][l]) / 2); if(i < n){ if(num[digit[i + 1][0]] & 1) f[i + 1][j][k][l] = min(f[i + 1][j][k][l], max(0, f[i][j][k][l] - 1)); else f[i + 1][j][k][l] = min(f[i][j][k][l] + 1, f[i + 1][j][k][l]); } if(j < n){ if(num[digit[j + 1][1]] & 1) f[i][j + 1][k][l] = min(f[i][j + 1][k][l], max(0, f[i][j][k][l] - 1)); else f[i][j + 1][k][l] = min(f[i][j][k][l] + 1, f[i][j + 1][k][l]); } if(k < n){ if(num[digit[k + 1][2]] & 1) f[i][j][k + 1][l] = min(f[i][j][k + 1][l], max(0, f[i][j][k][l] - 1)); else f[i][j][k + 1][l] = min(f[i][j][k][l] + 1, f[i][j][k + 1][l]); } if(l < n){ if(num[digit[l + 1][3]] & 1){ f[i][j][k][l + 1] = min(f[i][j][k][l + 1], max(0, f[i][j][k][l] - 1)); }else { f[i][j][k][l + 1] = min(f[i][j][k][l] + 1, f[i][j][k][l + 1]); } } } } for(int l = 1; l <= n; l++) num[digit[l][3]]--; } for(int k = 1; k <= n; k++) num[digit[k][2]]--; } for(int j = 1; j <= n; j++) num[digit[j][1]]--; } printf("%d\n", ans); } return 0;}
- 10118 - Free Candies
- uva 10118 Free Candies
- uva 10118 - Free Candies
- UVA - 10118 Free Candies
- uva 10118 - Free Candies
- UVA 10118 - Free Candies
- UVA - 10118 Free Candies
- UVA - 10118 Free Candies
- UVa 10118 Free Candies
- uva 10118 free candies
- UVA 10118 Free Candies
- UVA 10118 Free Candies
- uva 10118 Free Candies
- UVA 10118 Free Candies
- uva 10118Free Candies
- uva 10118 Free Candies
- uva 10118 Free Candies
- Free Candies - UVa 10118 dp
- hdu 1232 并查集小试牛刀
- 2011-7-30 16:54:26
- 置换 置换群 应用
- 论技术
- Spring整理11 -- 面对切面(AOP)1 -- 注解配置的方式实现AOP
- 10118 - Free Candies
- Git和Repo扫盲——如何取得Android源代码
- 【ORACLE】删除表数据的存储过程backup.sql
- Spring整理12 -- 面对切面(AOP)3 -- 使用CGLIB实现AOP
- 赋值运算符的重载函数,要求异常安全
- Spring整理12 -- 面对切面(AOP)2 -- 配置文件的方式实现AOP
- 教务系统--DAL层实现
- zoj1622
- 各种字符串hash函数比较