#include <bits/stdc++.h>
using namespace std;
int n,m,num;
int vis[10];
int maps[10];
int shengCheng[10][10];
int heat[10][10];
int ans;
void dfs(int now, int cnt){
int flag = 1;
for(int i = 0; i < num; i++){
if(vis[i] == 0){
vis[i] = 1;
dfs(shengCheng[now][maps[i]],cnt+heat[now][maps[i]]);
vis[i] = 0;
flag = 0;
}
}
if(flag == 1){
ans = min(ans,cnt);
}
}
int main(){
cin >> n;
while(n--){
cin >> m;
for(int i = 0; i < m; i++){
for(int j = 0; j < m; j++){
int a,b;
cin >> a >> b;
shengCheng[i][j] = a;
heat[i][j] = b;
}
}
memset(vis,0,sizeof(vis));
ans = INT_MAX;
cin >> num;
for(int i = 0; i < num; i++){
cin >> maps[i];
}
for(int i = 0; i < num; i++){
vis[i] = 1;
dfs(maps[i],0);
vis[i] = 0;
}
cout << ans << endl;
char x;
cin >> x;
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int n,m;
int dp[50][50][50][50];
int n1[50];
int n2[50];
int n3[50];
int n4[50];
int t1,t2,t3,t4;
int basket[105];
int tb;
int dfs(int m1,int m2,int m3,int m4){
if(dp[m1][m2][m3][m4] != -1){
return dp[m1][m2][m3][m4];
}
if(tb == 5){
return dp[m1][m2][m3][m4] = 0;
}
if(t1 < n-1 && tb < 5){
basket[n1[t1++]]++;
tb++;
if(basket[n1[t1-1]] >= 2){
basket[n1[t1-1]] -= 2;
tb -= 2;
dp[m1][m2][m3][m4] = max(dfs(m1-1,m2,m3,m4)+1,dp[m1][m2][m3][m4]);
basket[n1[t1-1]] ++;
tb++;
t1++;
}else{
dp[m1][m2][m3][m4] = max(dfs(m1-1,m2,m3,m4),dp[m1][m2][m3][m4]);
basket[n1[t1-1]] --;
tb--;
t1++;
}
}if(t4 < n-1 && tb < 5){
basket[n4[t4++]]++;
tb++;
if(basket[n4[t4-1]] >= 2){
basket[n4[t4-1]] -= 2;
tb -= 2;
dp[m1][m2][m3][m4] = max(dfs(m1,m2,m3,m4-1)+1,dp[m1][m2][m3][m4]);
basket[n4[t4-1]] ++;
tb++;
t4++;
}else{
dp[m1][m2][m3][m4] = max(dfs(m1,m2,m3,m4-1),dp[m1][m2][m3][m4]);
basket[n4[t4-1]] --;
tb--;
t4++;
}
}if(t2 < n-1 && tb < 5){
basket[n2[t2++]]++;
tb++;
if(basket[n2[t2-1]] >= 2){
basket[n2[t2-1]] -= 2;
tb -= 2;
dp[m1][m2][m3][m4] = max(dfs(m1,m2-1,m3,m4)+1,dp[m1][m2][m3][m4]);
basket[n2[t2-1]] ++;
tb++;
t2++;
}else{
dp[m1][m2][m3][m4] = max(dfs(m1,m2-1,m3,m4),dp[m1][m2][m3][m4]);
basket[n2[t2-1]] --;
tb--;
t2++;
}
}if(t3 < n-1 && tb < 5){
basket[n3[t3++]]++;
tb++;
if(basket[n3[t3-1]] >= 2){
basket[n3[t3-1]] -= 2;
tb -= 2;
dp[m1][m2][m3][m4] = max(dfs(m1,m2,m3-1,m4)+1,dp[m1][m2][m3][m4]);
basket[n3[t3-1]] ++;
tb++;
t3++;
}else{
dp[m1][m2][m3][m4] = max(dfs(m1,m2,m3-1,m4),dp[m1][m2][m3][m4]);
basket[n3[t3-1]] --;
tb--;
t3++;
}
}
if(dp[m1][m2][m3][m4] == -1){
dp[m1][m2][m3][m4] = 0;
}
return dp[m1][m2][m3][m4];
}
int main(){
while(1){
cin >> n;
if(n == 0){
break;
}
for(int i = 0; i < n; i++){
cin >> n1[i] >> n2[i] >> n3[i] >> n4[i];
}
t1 = t2 = t3 = t4 = 0;
memset(dp,-1,sizeof(dp));
memset(basket,0,sizeof(basket));
tb = 0;
cout << dfs(n,n,n,n) << endl;
}
return 0;
}
关于那些运算符,比如 Σ 这种的都是什么意思,用法是什么。(LZ是某八年级学生,没有学过高中数学)希望能够推荐比较好的博客或文章。(不要是视频,作为上海某民办学校八年级学生,尤其是五大竞赛不能保送的情况下,中考和WHK的压力还是很大的,我希望各位大佬能够给出一个平衡文化课和信息学竞赛的方案。我知道这很难,也知道需要足够的时间和练习作为竞赛的基础。)
关于学什么、为什么不会题目的问题
就算法来看,似乎提高组也不过(可能是用词不当)是一些基础算法。那么对于TG1=实力都没有的我来说,是否有意义学习其他的算法(其实已经学了3年+近4年了,而且现在我是绿+不会,绿-写挂),在学习较难的算法的过程中,课上的时间其实很有限,有没有推荐的书籍,主要介绍算法本身的原理的那种(最好简单但是深刻,虽然这有些不切实际),除了做题如何巩固这些算法,如何高效背模板(当然是要背会的,但是我总是错),如果把模板灵活的用于题目,如何识别题目需要的算法?如何解决基础算法不行,拿到比较基础的题目甚至会没有思路,写的代码总是出错,还找不出bug的问题(前面两个代码应该可以很好地印证这一点)?(这段是和前面重复的:作为上海某民办学校八年级学生,尤其是五大竞赛不能保送的情况下,中考和WHK的压力还是很大的,我希望各位大佬能够给出一个平衡文化课和信息学竞赛的方案。我知道这很难,也知道需要足够的时间和练习作为竞赛的基础。)
我觉得我可以料到答案。其实我的练习实在太少了,尽管学了3年的C++,但是只做了100+的题目。主要是因为我基础问题比较多,很多题目都调不好,并且能够付出的时间也比较少,我应该怎么办?
如果我的措辞不当或者某些观点出现问题,请指正。如果有表述不清的地方,或者各位大佬有解决之法,请at我(希望洛谷能够像一些比较强大的论坛能够实时通知,因为我还需要写作业QAQ,不是不重视这个,是因为要期末了)。