剑侠情缘状态hdu 4558 剑侠情缘(dp, 西山居复赛1第2题)
2013-05-26 22:51
232 查看
上班之余抽点时间出来写写博文,希望对新接触的朋友有帮助。今天在这里和大家一起学习一下剑侠情缘状态
标题:点击打开链接
思路:
这是刚练dp后做竞赛遇到的第一道dp题
竞赛时想了一个状态转移方程,f[i][j][k][l][2], i和j表现在第i行j列, k和l表现人和剑的能量,最后一维0表现以后这个能量给人补充,1表现给剑补充
转移为:
f[i][j][k][l][0] = f[i-1][j][k-mat[i][j]][l][1]+f[i][j][k-mat[i][j]][l][1];
f[i][j][k][l][1] = f[i-1][j][k][l-mat[i][j]][0]+f[i][j][k][l-mat[i][j]][0];
但是在实现时,还是遇到了各种问题,老是得不到样例,这样一直到竞赛结束...
结束后继续调试,终于调试出来了,结果一交,477*477*11*11的复杂度还是TLE了...
然后就很自然地想到了降维,把人和剑的能量变成了人和剑的能量差值
但是降维后,状态转移就变得不清楚了
比如差值为2的时候,有[0,2],[1,3],[2,4]...[8,10], 在不同范围区间内停止加减运算,会得到不一样的结果,
比如[0,2],0-2=9,变成[9,2]差值为7
而[2,4], 2-2=0, 变成[0,2]差值为-2
就不知道该怎样状态转移了。
后来,换了一种思考方法,对于差值k,对应人和剑的能量[x,y], 表现x加上k会等于y,就可以想通了
而状态转移[x-mat[i][j], y]和[x, y-mat[i][j]]怎样变成对应状态的差值呢?
明显,前者让差值增大了mat[i][j], 因为y-x-(y-(x-mat[i][j])) = mat[i][j],而后者让差值减少了mat[i][j]
总之,AC了这道题还是让我非常开心的 ^_^
代码:
每日一道理
俄国作家契诃夫说:“有大狗,有小狗,小狗不该因为大狗的存在而心慌意乱。所有的狗都应该叫,就让他各自用上帝给他的声音。
文章结束给大家分享下程序员的一些笑话语录:
与女友分手两月有余,精神萎靡,面带菜色。家人介绍一女孩,昨日与其相亲。女孩果然漂亮,一向吝啬的我决定破例请她吃晚饭。
选了一个蛮贵的西餐厅,点了比较贵的菜。女孩眉开眼笑,与我谈得很投机。聊着聊着,她说:“我给你讲个笑话吧。”“ok”
“一只螳螂要给一只雌蝴蝶介绍对象,见面时发现对方是只雄蜘蛛。见面后螳螂问蝴蝶‘如何?’,‘他长的太难看了’,‘别看人家长的丑,人家还有网站呢’。”
“呵呵………”我笑。忽然她问:“你有网站吗?”
---------------------------------
原创文章 By
剑侠情缘和状态
---------------------------------
标题:点击打开链接
思路:
这是刚练dp后做竞赛遇到的第一道dp题
竞赛时想了一个状态转移方程,f[i][j][k][l][2], i和j表现在第i行j列, k和l表现人和剑的能量,最后一维0表现以后这个能量给人补充,1表现给剑补充
转移为:
f[i][j][k][l][0] = f[i-1][j][k-mat[i][j]][l][1]+f[i][j][k-mat[i][j]][l][1];
f[i][j][k][l][1] = f[i-1][j][k][l-mat[i][j]][0]+f[i][j][k][l-mat[i][j]][0];
但是在实现时,还是遇到了各种问题,老是得不到样例,这样一直到竞赛结束...
结束后继续调试,终于调试出来了,结果一交,477*477*11*11的复杂度还是TLE了...
然后就很自然地想到了降维,把人和剑的能量变成了人和剑的能量差值
但是降维后,状态转移就变得不清楚了
比如差值为2的时候,有[0,2],[1,3],[2,4]...[8,10], 在不同范围区间内停止加减运算,会得到不一样的结果,
比如[0,2],0-2=9,变成[9,2]差值为7
而[2,4], 2-2=0, 变成[0,2]差值为-2
就不知道该怎样状态转移了。
后来,换了一种思考方法,对于差值k,对应人和剑的能量[x,y], 表现x加上k会等于y,就可以想通了
而状态转移[x-mat[i][j], y]和[x, y-mat[i][j]]怎样变成对应状态的差值呢?
明显,前者让差值增大了mat[i][j], 因为y-x-(y-(x-mat[i][j])) = mat[i][j],而后者让差值减少了mat[i][j]
总之,AC了这道题还是让我非常开心的 ^_^
代码:
每日一道理
俄国作家契诃夫说:“有大狗,有小狗,小狗不该因为大狗的存在而心慌意乱。所有的狗都应该叫,就让他各自用上帝给他的声音。
#include<iostream> #include<cstdio> #include<cstring> #include<string> #define MP make_pair #define SQ(x) ((x)*(x)) typedef long long int64; const double PI = acos(-1.0); const int MAXN = 110; const int INF = 0x3f3f3f3f; using namespace std; const int MOD = 1000000007; int n, m; int f[2][480][22][2]; int mat[480][480]; char str[1000]; int main(){ int nCase, cas=1; scanf("%d", &nCase); while(nCase--){ scanf("%d%d%*c", &n, &m); for(int i=1; i<=n; ++i){ gets(str); for(int j=1; j<=m; ++j) mat[i][j] = str[j-1]-'0'; } memset(f, 0, sizeof(f)); int ans = 0; bool p = 0; for(int i=1; i<=n; ++i){ p = !p; memset(f[p], 0, sizeof(f[p])); for(int j=1; j<=m; ++j){ for(int k=0; k<=10; ++k){ int x1 = (k+mat[i][j])%11; int x2 = (k-mat[i][j]+11)%11; f[p][j][k][0] += ((f[!p][j][x1][1]+f[p][j-1][x1][1])%MOD)%MOD; f[p][j][k][1] += ((f[!p][j][x2][0]+f[p][j-1][x2][0])%MOD)%MOD; } // 增长一种从以后点开始动身的情况 ++f[p][j][11-mat[i][j]][0]; } for(int j=1; j<=m; ++j){ ans += (f[p][j][0][0] + f[p][j][0][1])%MOD; ans %= MOD; } } printf("Case %d: %d\n",cas++, ans); } return 0; }
文章结束给大家分享下程序员的一些笑话语录:
与女友分手两月有余,精神萎靡,面带菜色。家人介绍一女孩,昨日与其相亲。女孩果然漂亮,一向吝啬的我决定破例请她吃晚饭。
选了一个蛮贵的西餐厅,点了比较贵的菜。女孩眉开眼笑,与我谈得很投机。聊着聊着,她说:“我给你讲个笑话吧。”“ok”
“一只螳螂要给一只雌蝴蝶介绍对象,见面时发现对方是只雄蜘蛛。见面后螳螂问蝴蝶‘如何?’,‘他长的太难看了’,‘别看人家长的丑,人家还有网站呢’。”
“呵呵………”我笑。忽然她问:“你有网站吗?”
---------------------------------
原创文章 By
剑侠情缘和状态
---------------------------------
相关文章推荐
- hdu 4558 剑侠情缘(dp, 西山居复赛1第2题)
- 2013 hdu 西山居复赛(1) HDU 4557 非诚勿扰 HDU 4558 剑侠情缘 HDU 4559 涂色游戏 HDU 4560
- 2013金山西山居创意游戏程序挑战赛——复赛(1) HDU 4557 非诚勿扰 HDU 4558 剑侠情缘 HDU 4559 涂色游戏 HDU 4560 我是歌手
- hdu 3001 dp 状态压缩 3进制
- hdu 4057(ac自动机+状态压缩dp)
- hdu 1074 状态dp
- HDU 4085 Peach Blossom Spring 斯坦纳树 状态压缩DP+SPFA
- HDU 5418 Victor and World(状态压缩路径DP或+floyd 两种方法 求 玈行商问题)经典
- HDU-4568 Hunter 最短路 + 状态压缩DP(TSP)
- hdu 4906 Our happy ending 状态压缩dp 较难
- hdu 5691 Sitting in Line 状态压缩dp
- hdu1074 状态压缩dp 记录路径
- 输入状态HDU 2577 动态规划(DP) How to Type
- HDU 1074 Doing Homework 状态压缩dp
- hdu 1074 状态压缩dp
- HDU 5816 Hearthstone(状态压缩DP+概率)
- HDU 4272LianLianKan 2012长春网络赛F题(思维) 暴力,dfs可以水过,正解是状态压缩dp
- HDU 4284 Travel(状态压缩DP)
- hdu 4529(状态dp)
- HDU - 3905 Sleeping (状态有点麻烦的DP)